Compare commits

...

40 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 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 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 03cb1af603 初步实现mysql适配,但暂时存在returning语法缺失问题 2024-06-17 17:51:43 +08:00
zhangyuheng d28d20757b 初步实现了迁移 2024-06-12 15:08:22 +08:00
73 changed files with 3656 additions and 1657 deletions

View File

@ -30,15 +30,16 @@
## 功能介绍 ## 功能介绍
- 支持 Postgresql 或 sqlite 存储数据; - 支持 Postgresql、Mysql、Sqlite3 存储数据;
- 支持BlueMap卫星地图渲染 - 支持BlueMap卫星地图渲染
- 支持为玩家单独设置特权; - 支持为玩家单独设置特权;
- 支持设置领地管理员; - 支持设置领地管理员;
- 支持子领地; - 支持子领地;
- 采用 TUI 方式进行权限配置交互,简单快捷; - 采用 TUI 方式进行权限配置交互,简单快捷;
- 支持基础价格系统 - 支持经济系统(需要 Vault 前置)
- 领地区域可视化; - 领地区域可视化;
- 管理员可在游戏内使用TUI配置领地系统 - 管理员可在游戏内使用TUI配置领地系统
- 支持[从 Residence 迁移](https://ssl.lunadeer.cn:14448/doc/73/)领地数据1.33.7+
<div style="text-align: center;"> <div style="text-align: center;">

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId> <groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId> <artifactId>Dominion</artifactId>
<version>1.32.2-beta</version> <version>1.35.0-beta</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Dominion</name> <name>Dominion</name>
@ -82,7 +82,7 @@
<dependency> <dependency>
<groupId>cn.lunadeer</groupId> <groupId>cn.lunadeer</groupId>
<artifactId>MinecraftPluginUtils</artifactId> <artifactId>MinecraftPluginUtils</artifactId>
<version>1.3.2-SNAPSHOT</version> <version>1.3.4-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.BlueMap-Minecraft</groupId> <groupId>com.github.BlueMap-Minecraft</groupId>
@ -90,5 +90,10 @@
<version>v2.6.2</version> <version>v2.6.2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.0</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion; package cn.lunadeer.dominion;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import com.flowpowered.math.vector.Vector2d; import com.flowpowered.math.vector.Vector2d;
import de.bluecolored.bluemap.api.BlueMapAPI; import de.bluecolored.bluemap.api.BlueMapAPI;
@ -17,112 +18,116 @@ public class BlueMapConnect {
if (!Dominion.config.getBlueMap()) { if (!Dominion.config.getBlueMap()) {
return; return;
} }
try { Scheduler.runTaskAsync(() -> {
BlueMapAPI.getInstance().ifPresent(api -> { try {
Map<String, List<DominionDTO>> world_dominions = new HashMap<>(); BlueMapAPI.getInstance().ifPresent(api -> {
for (DominionDTO dominion : Cache.instance.getDominions()) { Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
if (!world_dominions.containsKey(dominion.getWorld())) { for (DominionDTO dominion : Cache.instance.getDominions()) {
world_dominions.put(dominion.getWorld(), new ArrayList<>()); 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 -> {
for (Map.Entry<String, List<DominionDTO>> d : world_dominions.entrySet()) { MarkerSet markerSet = MarkerSet.builder()
api.getWorld(d.getKey()).ifPresent(world -> { .label("Dominion")
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();
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(); .build();
markerSet.getMarkers()
.put(dominion.getName(), marker);
}
for (BlueMapMap map : world.getMaps()) { for (DominionDTO dominion : d.getValue()) {
map.getMarkerSets().put(d.getKey() + "-" + markerSet.getLabel(), markerSet); 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));
} catch (NoClassDefFoundError e) { Shape shape = new Shape(vectors);
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); double x = vectors.iterator().next().getX();
XLogger.err(e.getMessage()); 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) { public static void renderMCA(Map<String, List<String>> mca_files) {
if (!Dominion.config.getBlueMap()) { if (!Dominion.config.getBlueMap()) {
return; return;
} }
try { Scheduler.runTaskAsync(() -> {
BlueMapAPI.getInstance().ifPresent(api -> { try {
for (String world : mca_files.keySet()) { BlueMapAPI.getInstance().ifPresent(api -> {
api.getWorld(world).ifPresent(bmWorld -> { for (String world : mca_files.keySet()) {
MarkerSet markerSet = MarkerSet.builder() api.getWorld(world).ifPresent(bmWorld -> {
.label("MCA") MarkerSet markerSet = MarkerSet.builder()
.defaultHidden(true) .label("MCA")
.build(); .defaultHidden(true)
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(); .build();
markerSet.getMarkers() for (String file : mca_files.get(world)) {
.put(file, marker); // r.-1.-1.mca
} int mca_x = Integer.parseInt(file.split("\\.")[1]);
for (BlueMapMap map : bmWorld.getMaps()) { int mca_z = Integer.parseInt(file.split("\\.")[2]);
map.getMarkerSets().put(world + "-" + markerSet.getLabel(), markerSet); 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<>();
} catch (NoClassDefFoundError e) { vectors.add(new Vector2d(world_x1 + 0.001, world_z1 + 0.001));
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); vectors.add(new Vector2d(world_x2 - 0.001, world_z1 + 0.001));
XLogger.err(e.getMessage()); 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,9 +1,7 @@
package cn.lunadeer.dominion; package cn.lunadeer.dominion;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.ParticleRender; import cn.lunadeer.minecraftpluginutils.ParticleRender;
import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
@ -26,16 +24,20 @@ public class Cache {
public Cache() { public Cache() {
player_current_dominion_id = new HashMap<>(); player_current_dominion_id = new HashMap<>();
loadDominions(); 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()) { if (_last_update_dominion.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
XLogger.debug("run loadDominionsExecution directly"); XLogger.debug("run loadDominionsExecution directly");
loadDominionsExecution(); loadDominionsExecution(idToLoad);
} else { } else {
if (_update_dominion_is_scheduled.get()) return; if (_update_dominion_is_scheduled.get()) return;
XLogger.debug("schedule loadDominionsExecution"); XLogger.debug("schedule loadDominionsExecution");
@ -43,76 +45,158 @@ public class Cache {
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion.get())) / 1000 * 20L; long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion.get())) / 1000 * 20L;
Scheduler.runTaskLaterAsync(() -> { Scheduler.runTaskLaterAsync(() -> {
XLogger.debug("run loadDominionsExecution scheduled"); XLogger.debug("run loadDominionsExecution scheduled");
loadDominionsExecution(); loadDominionsExecution(idToLoad);
_update_dominion_is_scheduled.set(false); _update_dominion_is_scheduled.set(false);
}, },
delay_tick); delay_tick);
} }
} }
private void loadDominionsExecution() { public void loadDominions() {
long start = System.currentTimeMillis(); loadDominions(null);
id_dominions = new ConcurrentHashMap<>(); }
world_dominion_tree = new ConcurrentHashMap<>();
dominion_children = new ConcurrentHashMap<>(); private void loadDominionsExecution(Integer idToLoad) {
List<DominionDTO> dominions = DominionDTO.selectAll(); Scheduler.runTaskAsync(() -> {
Map<String, List<DominionDTO>> world_dominions = new HashMap<>(); long start = System.currentTimeMillis();
for (DominionDTO d : dominions) { int count = 0;
if (!world_dominions.containsKey(d.getWorld())) { if (idToLoad == null) {
world_dominions.put(d.getWorld(), new ArrayList<>()); 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); BlueMapConnect.render();
id_dominions.put(d.getId(), d); recheckPlayerState = true;
if (!dominion_children.containsKey(d.getParentDomId())) { _last_update_dominion.set(System.currentTimeMillis());
dominion_children.put(d.getParentDomId(), new ArrayList<>()); XLogger.debug("loadDominionsExecution cost: %d ms for %d dominions"
} , System.currentTimeMillis() - start, count);
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();
recheckPlayerState = true;
_last_update_dominion.set(System.currentTimeMillis());
XLogger.debug("loadDominionsExecution cost: %d ms", System.currentTimeMillis() - start);
} }
/** /**
* 从数据库加载所有玩家特权 * 从数据库加载所有玩家特权
* 如果player_uuid为null则加载所有玩家的特权
*
* @param player_uuid 玩家UUID
*/ */
public void loadPlayerPrivileges() { public void loadMembers(UUID player_uuid) {
if (_last_update_privilege.get() + UPDATE_INTERVAL < System.currentTimeMillis()) { if (_last_update_member.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
loadPlayerPrivilegesExecution(); XLogger.debug("run loadMembersExecution directly");
loadMembersExecution(player_uuid);
} else { } else {
if (_update_privilege_is_scheduled.get()) return; if (_update_member_is_scheduled.get()) return;
_update_privilege_is_scheduled.set(true); XLogger.debug("schedule loadMembersExecution");
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_dominion.get())) / 1000 * 20L; _update_member_is_scheduled.set(true);
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_member.get())) / 1000 * 20L;
Scheduler.runTaskLaterAsync(() -> { Scheduler.runTaskLaterAsync(() -> {
loadPlayerPrivilegesExecution(); XLogger.debug("run loadMembersExecution scheduled");
_update_privilege_is_scheduled.set(false); loadMembersExecution(player_uuid);
_update_member_is_scheduled.set(false);
}, },
delay_tick); delay_tick);
} }
} }
private void loadPlayerPrivilegesExecution() { public void loadMembers() {
long start = System.currentTimeMillis(); loadMembers(null);
List<PlayerPrivilegeDTO> all_privileges = PlayerPrivilegeDTO.selectAll(); }
if (all_privileges == null) {
XLogger.err("加载玩家特权失败"); private void loadMembersExecution(UUID player_to_update) {
return; Scheduler.runTaskAsync(() -> {
} long start = System.currentTimeMillis();
player_uuid_to_privilege = new ConcurrentHashMap<>(); List<MemberDTO> all_privileges;
for (PlayerPrivilegeDTO privilege : all_privileges) { if (player_to_update == null) {
UUID player_uuid = privilege.getPlayerUUID(); all_privileges = MemberDTO.selectAll();
if (!player_uuid_to_privilege.containsKey(player_uuid)) { player_uuid_to_member = new ConcurrentHashMap<>();
player_uuid_to_privilege.put(player_uuid, 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);
} }
recheckPlayerState = true; }
_last_update_privilege.set(System.currentTimeMillis());
XLogger.debug("loadPlayerPrivilegesExecution cost: %d ms", System.currentTimeMillis() - start); 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);
});
} }
/** /**
@ -199,9 +283,18 @@ public class Cache {
player.setGlowing(false); player.setGlowing(false);
return; return;
} }
PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion); MemberDTO privilege = getMember(player, dominion);
if (privilege != null) { 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 { } else {
player.setGlowing(dominion.getFlagValue(Flag.GLOW)); player.setGlowing(dominion.getFlagValue(Flag.GLOW));
} }
@ -227,9 +320,18 @@ public class Cache {
player.setAllowFlight(false); player.setAllowFlight(false);
return; return;
} }
PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion); MemberDTO privilege = getMember(player, dominion);
if (privilege != null) { 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 { } else {
player.setAllowFlight(dominion.getFlagValue(Flag.FLY)); player.setAllowFlight(dominion.getFlagValue(Flag.FLY));
} }
@ -245,7 +347,7 @@ public class Cache {
if (player == null) return dominionTree; if (player == null) return dominionTree;
for (List<DominionNode> tree : world_dominion_tree.values()) { for (List<DominionNode> tree : world_dominion_tree.values()) {
for (DominionNode node : tree) { for (DominionNode node : tree) {
if (node.dominion.getOwner().equals(player.getUuid())) { if (node.getDominion().getOwner().equals(player.getUuid())) {
dominionTree.add(node); dominionTree.add(node);
} }
} }
@ -261,6 +363,10 @@ public class Cache {
return dominionTree; return dominionTree;
} }
public GroupDTO getGroup(Integer id) {
return id_groups.get(id);
}
/** /**
* 获取玩家在指定领地的特权 * 获取玩家在指定领地的特权
* 如果玩家不存在特权则返回null * 如果玩家不存在特权则返回null
@ -269,14 +375,14 @@ public class Cache {
* @param dominion 领地 * @param dominion 领地
* @return 特权表 * @return 特权表
*/ */
public PlayerPrivilegeDTO getPlayerPrivilege(Player player, DominionDTO dominion) { public MemberDTO getMember(Player player, DominionDTO dominion) {
if (!player_uuid_to_privilege.containsKey(player.getUniqueId())) return null; if (!player_uuid_to_member.containsKey(player.getUniqueId())) return null;
return player_uuid_to_privilege.get(player.getUniqueId()).get(dominion.getId()); return player_uuid_to_member.get(player.getUniqueId()).get(dominion.getId());
} }
public PlayerPrivilegeDTO getPlayerPrivilege(UUID player_uuid, DominionDTO dominion) { public MemberDTO getMember(UUID player_uuid, DominionDTO dominion) {
if (!player_uuid_to_privilege.containsKey(player_uuid)) return null; if (!player_uuid_to_member.containsKey(player_uuid)) return null;
return player_uuid_to_privilege.get(player_uuid).get(dominion.getId()); return player_uuid_to_member.get(player_uuid).get(dominion.getId());
} }
private static boolean isInDominion(@Nullable DominionDTO dominion, Player player) { private static boolean isInDominion(@Nullable DominionDTO dominion, Player player) {
@ -304,6 +410,25 @@ public class Cache {
return count; 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() { public List<DominionDTO> getDominions() {
return new ArrayList<>(id_dominions.values()); return new ArrayList<>(id_dominions.values());
} }
@ -311,14 +436,19 @@ public class Cache {
public static Cache instance; public static Cache instance;
private ConcurrentHashMap<Integer, DominionDTO> id_dominions; private ConcurrentHashMap<Integer, DominionDTO> id_dominions;
private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree; 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 final Map<UUID, Integer> player_current_dominion_id; // 玩家当前所在领地
private ConcurrentHashMap<Integer, List<Integer>> dominion_children; private ConcurrentHashMap<Integer, List<Integer>> dominion_children;
private final AtomicLong _last_update_dominion = new AtomicLong(0); private final AtomicLong _last_update_dominion = new AtomicLong(0);
private final AtomicBoolean _update_dominion_is_scheduled = new AtomicBoolean(false); private final AtomicBoolean _update_dominion_is_scheduled = new AtomicBoolean(false);
private final AtomicLong _last_update_privilege = new AtomicLong(0); private final AtomicLong _last_update_member = new AtomicLong(0);
private final AtomicBoolean _update_privilege_is_scheduled = new AtomicBoolean(false); private final AtomicBoolean _update_member_is_scheduled = new AtomicBoolean(false);
private static final long UPDATE_INTERVAL = 1000 * 5; 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; // 是否需要重新检查玩家状态发光飞行 private boolean recheckPlayerState = false; // 是否需要重新检查玩家状态发光飞行
public final Map<UUID, LocalDateTime> NextTimeAllowTeleport = new java.util.HashMap<>(); public final Map<UUID, LocalDateTime> NextTimeAllowTeleport = new java.util.HashMap<>();
private Map<UUID, List<ResMigration.ResidenceNode>> residence_data = null;
} }

View File

@ -4,7 +4,15 @@ import cn.lunadeer.dominion.commands.*;
import cn.lunadeer.dominion.controllers.PlayerController; import cn.lunadeer.dominion.controllers.PlayerController;
import cn.lunadeer.dominion.cuis.*; import cn.lunadeer.dominion.cuis.*;
import cn.lunadeer.dominion.dtos.PlayerDTO; 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.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor; import org.bukkit.command.TabExecutor;
@ -19,24 +27,6 @@ import java.util.List;
import static cn.lunadeer.dominion.commands.Helper.*; import static cn.lunadeer.dominion.commands.Helper.*;
public class Commands implements TabExecutor { 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. * Executes the given command, returning its success.
@ -61,19 +51,19 @@ public class Commands implements TabExecutor {
Menu.show(sender, args); Menu.show(sender, args);
break; break;
case "list": case "list":
ListDominion.show(sender, args); DominionList.show(sender, args);
break; break;
case "help": case "help":
cn.lunadeer.dominion.tuis.Apis.printHelp(sender, args); cn.lunadeer.dominion.tuis.Apis.printHelp(sender, args);
break; break;
case "info": case "info":
DominionSizeInfo.show(sender, args); SizeInfo.show(sender, args);
break; break;
case "manage": case "manage":
DominionManage.show(sender, args); DominionManage.show(sender, args);
break; break;
case "flag_info": case "guest_setting":
DominionFlagInfo.show(sender, args); GuestSetting.show(sender, args);
break; break;
case "create": case "create":
DominionOperate.createDominion(sender, args); DominionOperate.createDominion(sender, args);
@ -99,24 +89,6 @@ public class Commands implements TabExecutor {
case "set": case "set":
DominionFlag.setDominionFlag(sender, args); DominionFlag.setDominionFlag(sender, args);
break; 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": case "set_enter_msg":
DominionOperate.setEnterMessage(sender, args); DominionOperate.setEnterMessage(sender, args);
break; break;
@ -144,8 +116,8 @@ public class Commands implements TabExecutor {
case "export_mca": case "export_mca":
Operator.exportMca(sender, args); Operator.exportMca(sender, args);
break; break;
case "config": case "sys_config":
DominionConfig.show(sender, args); SysConfig.show(sender, args);
break; break;
case "set_config": case "set_config":
SetConfig.handler(sender, args); SetConfig.handler(sender, args);
@ -153,32 +125,27 @@ public class Commands implements TabExecutor {
case "all_dominion": case "all_dominion":
AllDominion.show(sender, args); AllDominion.show(sender, args);
break; break;
case "template_list": case "migrate_list":
TemplateList.show(sender, args); MigrateList.show(sender, args);
break; break;
case "template_manage": case "migrate":
TemplateManage.show(sender, args); Migration.migrate(sender, args);
break;
case "template_delete":
Template.deleteTemplate(sender, args);
break;
case "template_create":
Template.createTemplate(sender, args);
break;
case "template_set_flag":
Template.setTemplateFlag(sender, args);
break;
case "apply_template":
PlayerPrivilege.applyTemplate(sender, args);
break;
case "select_template":
SelectTemplate.show(sender, args);
break; break;
case "set_map_color": case "set_map_color":
DominionOperate.setMapColor(sender, args); DominionOperate.setMapColor(sender, args);
break; break;
case "env_info": case "env_setting":
DominionEnvInfo.show(sender, args); 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; break;
// ---=== CUI ===--- // ---=== CUI ===---
case "cui_rename": case "cui_rename":
@ -193,8 +160,8 @@ public class Commands implements TabExecutor {
case "cui_create": case "cui_create":
CreateDominion.open(sender, args); CreateDominion.open(sender, args);
break; break;
case "cui_create_privilege": case "cui_member_add":
CreatePrivilege.open(sender, args); MemberAdd.open(sender, args);
break; break;
case "cui_template_create": case "cui_template_create":
CreateTemplate.open(sender, args); CreateTemplate.open(sender, args);
@ -202,6 +169,12 @@ public class Commands implements TabExecutor {
case "cui_set_map_color": case "cui_set_map_color":
SetMapColor.open(sender, args); SetMapColor.open(sender, args);
break; break;
case "cui_create_group":
CreateGroup.open(sender, args);
break;
case "cui_rename_group":
RenameGroup.open(sender, args);
break;
default: default:
return false; return false;
} }
@ -224,9 +197,8 @@ public class Commands implements TabExecutor {
@Override @Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (args.length == 1) { 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", "auto_create", "create_sub", "auto_create_sub", "expand", "contract", "delete", "set",
"create_privilege", "set_privilege", "clear_privilege", "list", "privilege_info",
"set_enter_msg", "set_enter_msg",
"set_leave_msg", "set_leave_msg",
"set_tp_location", "set_tp_location",
@ -236,32 +208,35 @@ public class Commands implements TabExecutor {
"reload_cache", "reload_cache",
"reload_config", "reload_config",
"export_mca", "export_mca",
"config", "sys_config",
"apply_template",
"template_list",
"template_manage",
"template_delete",
"template_create",
"template_set_flag",
"all_dominion", "all_dominion",
"set_map_color" "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) { if (args.length == 2) {
switch (args[0]) { switch (args[0]) {
case "help": case "help":
case "list": case "list":
case "config": case "sys_config":
case "template_list":
return Collections.singletonList("页码(可选)");
case "create": case "create":
case "auto_create": case "auto_create":
return Collections.singletonList("输入领地名称"); return Collections.singletonList("输入领地名称");
case "delete": case "delete":
case "info": case "info":
case "manage": case "manage":
case "flag_info": case "guest_setting":
case "privilege_list":
case "rename": case "rename":
case "give": case "give":
case "set_tp_location": case "set_tp_location":
@ -270,12 +245,6 @@ public class Commands implements TabExecutor {
return allDominions(); return allDominions();
case "set": case "set":
return dominionFlags(); return dominionFlags();
case "create_privilege":
case "set_privilege":
case "clear_privilege":
case "privilege_info":
case "apply_template":
return playerNames();
case "expand": case "expand":
case "contract": case "contract":
return Collections.singletonList("大小(整数)"); return Collections.singletonList("大小(整数)");
@ -286,12 +255,6 @@ public class Commands implements TabExecutor {
return Collections.singletonList("进入提示语内容"); return Collections.singletonList("进入提示语内容");
case "set_leave_msg": case "set_leave_msg":
return Collections.singletonList("离开提示语内容"); return Collections.singletonList("离开提示语内容");
case "template_manage":
case "template_delete":
case "template_set_flag":
return allTemplates(sender);
case "template_create":
return Collections.singletonList("输入模板名称");
case "set_map_color": case "set_map_color":
return Collections.singletonList("输入颜色(16进制)"); return Collections.singletonList("输入颜色(16进制)");
} }
@ -300,48 +263,34 @@ public class Commands implements TabExecutor {
switch (args[0]) { switch (args[0]) {
case "set": case "set":
return boolOptions(); return boolOptions();
case "set_privilege":
case "template_set_flag":
return playerPrivileges();
case "expand": case "expand":
case "contract": case "contract":
case "clear_privilege":
case "create_privilege":
case "privilege_info":
case "auto_create_sub": case "auto_create_sub":
case "create_sub": case "create_sub":
case "set_enter_msg": case "set_enter_msg":
case "set_leave_msg": case "set_leave_msg":
case "apply_template":
case "set_map_color": case "set_map_color":
return playerDominions(sender); return playerDominions(sender);
case "rename": case "rename":
return Collections.singletonList("输入新领地名称"); return Collections.singletonList("输入新领地名称");
case "give": case "give":
return playerNames(); return playerNames();
case "template_manage":
return Collections.singletonList("页码(可选)");
} }
} }
if (args.length == 4) { if (args.length == 4) {
switch (args[0]) { switch (args[0]) {
case "set": case "set":
return playerDominions(sender); return playerDominions(sender);
case "set_privilege":
case "template_set_flag":
return boolOptions();
case "apply_template":
return allTemplates(sender);
} }
} }
return null; return null;
} }
private static List<String> boolOptions() { public static List<String> boolOptions() {
return Arrays.asList("true", "false"); return Arrays.asList("true", "false");
} }
private static List<String> playerNames() { public static List<String> playerNames() {
List<PlayerDTO> players = PlayerController.allPlayers(); List<PlayerDTO> players = PlayerController.allPlayers();
List<String> names = new ArrayList<>(); List<String> names = new ArrayList<>();
for (PlayerDTO player : players) { 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.ConfigManager;
import cn.lunadeer.dominion.managers.DatabaseTables; import cn.lunadeer.dominion.managers.DatabaseTables;
import cn.lunadeer.minecraftpluginutils.*; import cn.lunadeer.minecraftpluginutils.*;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseType;
import cn.lunadeer.minecraftpluginutils.scui.CuiManager; import cn.lunadeer.minecraftpluginutils.scui.CuiManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@ -26,8 +28,8 @@ public final class Dominion extends JavaPlugin {
new XLogger(this); new XLogger(this);
config = new ConfigManager(this); config = new ConfigManager(this);
XLogger.setDebug(config.isDebug()); XLogger.setDebug(config.isDebug());
database = new DatabaseManager(this, new DatabaseManager(this,
DatabaseManager.TYPE.valueOf(config.getDbType().toUpperCase()), DatabaseType.valueOf(config.getDbType().toUpperCase()),
config.getDbHost(), config.getDbHost(),
config.getDbPort(), config.getDbPort(),
config.getDbName(), config.getDbName(),
@ -74,12 +76,11 @@ public final class Dominion extends JavaPlugin {
@Override @Override
public void onDisable() { public void onDisable() {
// Plugin shutdown logic // Plugin shutdown logic
database.close(); DatabaseManager.instance.close();
} }
public static Dominion instance; public static Dominion instance;
public static ConfigManager config; public static ConfigManager config;
public static DatabaseManager database;
public static Map<UUID, Map<Integer, Location>> pointsSelect = new HashMap<>(); public static Map<UUID, Map<Integer, Location>> pointsSelect = new HashMap<>();
private GiteaReleaseCheck giteaReleaseCheck; private GiteaReleaseCheck giteaReleaseCheck;
} }

View File

@ -5,30 +5,52 @@ import org.bukkit.Location;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
public class DominionNode { public class DominionNode {
public DominionDTO dominion; private Integer dominion_id;
public List<DominionNode> children = new ArrayList<>(); 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) { 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) { 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(); DominionNode node = new DominionNode();
node.dominion = dominion; node.dominion_id = dominion.getId();
node.children = BuildNodeTree(dominion.getId(), dominions); node.children = buildTree(dominion.getId(), parentToChildrenMap);
dominionTree.add(node); dominionTree.add(node);
} }
} }
return dominionTree; return dominionTree;
} }
public static DominionNode getLocInDominionNode(@NotNull List<DominionNode> nodes, @NotNull Location loc) { public static DominionNode getLocInDominionNode(@NotNull List<DominionNode> nodes, @NotNull Location loc) {
for (DominionNode node : nodes) { for (DominionNode node : nodes) {
if (isInDominion(node.dominion, loc)) { if (isInDominion(node.getDominion(), loc)) {
if (node.children.isEmpty()) { if (node.children.isEmpty()) {
return node; return node;
} else { } else {
@ -48,7 +70,7 @@ public class DominionNode {
if (nodes == null) return null; if (nodes == null) return null;
if (nodes.isEmpty()) return null; if (nodes.isEmpty()) return null;
DominionNode dominionNode = getLocInDominionNode(nodes, loc); 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) { public static boolean isInDominion(@Nullable DominionDTO dominion, Location location) {

View File

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

View File

@ -3,8 +3,8 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.FlagsController; import cn.lunadeer.dominion.controllers.FlagsController;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.tuis.DominionEnvInfo; import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting;
import cn.lunadeer.dominion.tuis.DominionFlagInfo; import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -35,9 +35,9 @@ public class DominionFlag {
newArgs[1] = args[3]; newArgs[1] = args[3];
newArgs[2] = args[4]; newArgs[2] = args[4];
if (Flag.isDominionOnlyFlag(args[1])) { if (Flag.isDominionOnlyFlag(args[1])) {
DominionEnvInfo.show(sender, newArgs); EnvSetting.show(sender, newArgs);
} else { } else {
DominionFlagInfo.show(sender, newArgs); GuestSetting.show(sender, newArgs);
} }
} else { } else {

View File

@ -6,7 +6,8 @@ import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
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.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.Teleport; import cn.lunadeer.minecraftpluginutils.Teleport;
@ -374,7 +375,7 @@ public class DominionOperate {
return; return;
} }
PlayerPrivilegeDTO privilegeDTO = PlayerPrivilegeDTO.select(player.getUniqueId(), dominionDTO.getId()); MemberDTO privilegeDTO = MemberDTO.select(player.getUniqueId(), dominionDTO.getId());
if (!player.getUniqueId().equals(dominionDTO.getOwner())) { // 领地所有人可以传送到自己的领地 if (!player.getUniqueId().equals(dominionDTO.getOwner())) { // 领地所有人可以传送到自己的领地
if (privilegeDTO == null) { if (privilegeDTO == null) {
if (!dominionDTO.getFlagValue(Flag.TELEPORT)) { if (!dominionDTO.getFlagValue(Flag.TELEPORT)) {
@ -382,9 +383,17 @@ public class DominionOperate {
return; return;
} }
} else { } else {
if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) { if (privilegeDTO.getGroupId() == -1) {
Notification.error(sender, "你不被允许传送到这个领地"); if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) {
return; Notification.error(sender, "你不被允许传送到这个领地");
return;
}
} else {
GroupDTO groupDTO = Cache.instance.getGroup(privilegeDTO.getGroupId());
if (!groupDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你所在的权限组组不被允许传送到这个领地");
return;
}
} }
} }
} }
@ -400,21 +409,33 @@ public class DominionOperate {
} }
if (Dominion.config.getTpDelay() > 0) { if (Dominion.config.getTpDelay() > 0) {
Notification.info(player, "传送将在 %d 秒后执行", Dominion.config.getTpDelay()); 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())); Cache.instance.NextTimeAllowTeleport.put(player.getUniqueId(), now.plusSeconds(Dominion.config.getTpCoolDown()));
Scheduler.runTaskLater(() -> { Scheduler.runTaskLater(() -> {
Location location = dominionDTO.getTpLocation(); 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) { if (location == null) {
int x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2; location = new Location(world, center_x, player.getLocation().getY(), center_z);
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()); XLogger.warn("领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName());
} else if (!isInDominion(dominionDTO, location)) { } else if (!isInDominion(dominionDTO, location)) {
int x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2; location = new Location(world, center_x, player.getLocation().getY(), center_z);
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()); XLogger.warn("领地 %s 传送点不在领地内,将尝试传送到中心点", dominionDTO.getName());
} }
if (player.isOnline()) { if (player.isOnline()) {
@ -432,8 +453,8 @@ public class DominionOperate {
/** /**
* 设置领地卫星地图地块颜色 * 设置领地卫星地图地块颜色
* *
* @param sender 命令发送者 * @param sender 命令发送者
* @param args 命令参数 * @param args 命令参数
*/ */
public static void setMapColor(CommandSender sender, String[] args) { public static void setMapColor(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);

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,10 +1,7 @@
package cn.lunadeer.dominion.commands; package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -41,6 +38,32 @@ public class Helper {
return dominions_name; 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) { public static List<String> playerOwnDominions(CommandSender sender) {
List<String> dominions_name = new ArrayList<>(); List<String> dominions_name = new ArrayList<>();
Player player = playerOnly(sender); Player player = playerOnly(sender);
@ -56,8 +79,8 @@ public class Helper {
List<String> dominions_name = new ArrayList<>(); List<String> dominions_name = new ArrayList<>();
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return dominions_name; if (player == null) return dominions_name;
List<PlayerPrivilegeDTO> dominions_admin = PlayerPrivilegeDTO.selectAll(player.getUniqueId()); List<MemberDTO> dominions_admin = MemberDTO.selectAll(player.getUniqueId());
for (PlayerPrivilegeDTO privilege : dominions_admin) { for (MemberDTO privilege : dominions_admin) {
if (privilege.getAdmin()) { if (privilege.getAdmin()) {
DominionDTO dom = DominionDTO.select(privilege.getDomID()); DominionDTO dom = DominionDTO.select(privilege.getDomID());
if (dom == null) continue; if (dom == null) continue;

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

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

View File

@ -1,128 +0,0 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.PrivilegeController;
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);
}
}
/**
* 应用权限模板
* /dominion apply_template <玩家名称> <领地名称> <模板名称>
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void applyTemplate(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length < 4) {
Notification.error(sender, "用法: /dominion apply_template <玩家名称> <领地名称> <模板名称>");
return;
}
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
String playerName = args[1];
String dominionName = args[2];
String templateName = args[3];
PrivilegeController.applyTemplate(operator, dominionName, playerName, templateName);
if (args.length == 5) {
String[] newArgs = new String[3];
newArgs[0] = "privilege_list";
newArgs[1] = dominionName;
newArgs[2] = args[4];
DominionPrivilegeList.show(sender, newArgs);
}
}
}

View File

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

@ -2,98 +2,150 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController; import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.tuis.TemplateList; import cn.lunadeer.dominion.tuis.template.TemplateList;
import cn.lunadeer.dominion.tuis.TemplateManage; import cn.lunadeer.dominion.tuis.template.TemplateSetting;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; 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.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 { public class Template {
/**
* 删除权限模板
* /dominion template_delete <模板名称> [页码]
*
* @param sender 命令发送者
* @param args 命令参数
*/
public static void deleteTemplate(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
if (args.length < 2) {
Notification.error(sender, "用法: /dominion template_delete <模板名称>");
return;
}
TemplateController.deleteTemplate(operator, args[1]);
String[] newArgs = new String[2];
newArgs[0] = "template_list";
if (args.length == 3) {
newArgs[1] = args[2];
} else {
newArgs[1] = "1";
}
TemplateList.show(sender, newArgs);
}
/** /**
* 创建权限模板 * 创建权限模板
* /dominion template_create <模板名称> [页码] * /dominion template create <模板名称> [页码]
* *
* @param sender 命令发送者 * @param sender 命令发送者
* @param args 命令参数 * @param args 命令参数
*/ */
public static void createTemplate(CommandSender sender, String[] args) { public static void createTemplate(CommandSender sender, String[] args) {
Player player = playerOnly(sender); try {
if (player == null) return; if (args.length < 3) {
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); Notification.error(sender, "用法: /dominion template create <模板名称>");
if (args.length < 2) { return;
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());
} }
TemplateController.createTemplate(operator, args[1]);
String[] newArgs = new String[2];
newArgs[0] = "template_list";
newArgs[1] = "1";
TemplateList.show(sender, newArgs);
} }
/** /**
* 编辑模板 * 编辑模板
* /dominion template_set_flag <模板名称> <权限名称> <true/false> [页码] * /dominion template set_flag <模板名称> <权限名称> <true/false> [页码]
* *
* @param sender 命令发送者 * @param sender 命令发送者
* @param args 命令参数 * @param args 命令参数
*/ */
public static void setTemplateFlag(CommandSender sender, String[] args) { public static void setTemplateFlag(CommandSender sender, String[] args) {
Player player = playerOnly(sender); try {
if (player == null) return; if (args.length < 5) {
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); Notification.error(sender, "用法: /dominion template set_flag <模板名称> <权限名称> <true/false>");
if (args.length < 4) { return;
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());
} }
boolean value; }
if (args[3].equalsIgnoreCase("true")) {
value = true;
} else if (args[3].equalsIgnoreCase("false")) { public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
value = false; switch (args[1]) {
} else { case "list":
Notification.error(sender, "权限值必须是true或false"); TemplateList.show(sender, args);
return; 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("页码(可选)");
}
} }
TemplateController.setTemplateFlag(operator, args[1], args[2], value);
String[] newArgs = new String[3];
newArgs[0] = "template_manage";
newArgs[1] = args[1];
if (args.length == 5) { if (args.length == 5) {
newArgs[2] = args[4]; switch (args[1]) {
} else { case "set_flag":
newArgs[2] = "1"; return boolOptions();
}
} }
TemplateManage.show(sender, newArgs); return null;
} }
} }

View File

@ -2,7 +2,7 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
import org.bukkit.Location; import org.bukkit.Location;
public class Apis { public class Apis {
@ -15,7 +15,7 @@ public class Apis {
public static boolean noAuthToChangeFlags(AbstractOperator player, DominionDTO dominion) { public static boolean noAuthToChangeFlags(AbstractOperator player, DominionDTO dominion) {
if (player.isOp()) return false; if (player.isOp()) return false;
if (!dominion.getOwner().equals(player.getUniqueId())) { if (!dominion.getOwner().equals(player.getUniqueId())) {
PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId()); MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId());
if (privileges == null || !privileges.getAdmin()) { if (privileges == null || !privileges.getAdmin()) {
player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不是领地 %s 的拥有者或管理员,无权修改权限", dominion.getName())); player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不是领地 %s 的拥有者或管理员,无权修改权限", dominion.getName()));
return true; return true;

View File

@ -45,8 +45,8 @@ public class BukkitPlayerOperator implements AbstractOperator {
@Override @Override
public BlockFace getDirection() { public BlockFace getDirection() {
float yaw = player.getYaw(); float yaw = player.getLocation().getYaw();
float pitch = player.getPitch(); float pitch = player.getLocation().getPitch();
if (pitch > -45 && pitch < 45) { if (pitch > -45 && pitch < 45) {
if (yaw > -45 && yaw < 45) { if (yaw > -45 && yaw < 45) {
return BlockFace.SOUTH; return BlockFace.SOUTH;

View File

@ -38,7 +38,6 @@ public class DominionController {
* @param name 领地名称 * @param name 领地名称
* @param loc1 位置1 * @param loc1 位置1
* @param loc2 位置2 * @param loc2 位置2
* @return 创建的领地
*/ */
public static void create(AbstractOperator operator, String name, Location loc1, Location loc2) { public static void create(AbstractOperator operator, String name, Location loc1, Location loc2) {
DominionDTO parent = getPlayerCurrentDominion(operator); DominionDTO parent = getPlayerCurrentDominion(operator);
@ -57,11 +56,26 @@ public class DominionController {
* @param loc1 位置1 * @param loc1 位置1
* @param loc2 位置2 * @param loc2 位置2
* @param parent_dominion_name 父领地名称 * @param parent_dominion_name 父领地名称
* @return 创建的领地
*/ */
public static void create(AbstractOperator operator, String name, public static void create(AbstractOperator operator, String name,
Location loc1, Location loc2, Location loc1, Location loc2,
String parent_dominion_name) { String parent_dominion_name) {
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, "创建领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建领地失败");
if (name.isEmpty()) { if (name.isEmpty()) {
operator.setResponse(FAIL.addMessage("领地名称不能为空")); operator.setResponse(FAIL.addMessage("领地名称不能为空"));
@ -143,7 +157,7 @@ public class DominionController {
} }
} }
// 检查经济 // 检查经济
if (Dominion.config.getEconomyEnable()) { if (Dominion.config.getEconomyEnable() && !skipEco) {
if (!VaultConnect.instance.economyAvailable()) { if (!VaultConnect.instance.economyAvailable()) {
operator.setResponse(FAIL.addMessage("没有可用的经济插件系统,请联系服主。")); operator.setResponse(FAIL.addMessage("没有可用的经济插件系统,请联系服主。"));
return; return;
@ -181,7 +195,6 @@ public class DominionController {
* *
* @param operator 操作者 * @param operator 操作者
* @param size 扩展的大小 * @param size 扩展的大小
* @return 扩展后的领地
*/ */
public static void expand(AbstractOperator operator, Integer size) { public static void expand(AbstractOperator operator, Integer size) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
@ -198,7 +211,6 @@ public class DominionController {
* @param operator 操作者 * @param operator 操作者
* @param size 扩展的大小 * @param size 扩展的大小
* @param dominion_name 领地名称 * @param dominion_name 领地名称
* @return 扩展后的领地
*/ */
public static void expand(AbstractOperator operator, Integer size, String dominion_name) { public static void expand(AbstractOperator operator, Integer size, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "扩展领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "扩展领地失败");
@ -304,7 +316,6 @@ public class DominionController {
* *
* @param operator 操作者 * @param operator 操作者
* @param size 缩小的大小 * @param size 缩小的大小
* @return 缩小后的领地
*/ */
public static void contract(AbstractOperator operator, Integer size) { public static void contract(AbstractOperator operator, Integer size) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
@ -321,7 +332,6 @@ public class DominionController {
* @param operator 操作者 * @param operator 操作者
* @param size 缩小的大小 * @param size 缩小的大小
* @param dominion_name 领地名称 * @param dominion_name 领地名称
* @return 缩小后的领地
*/ */
public static void contract(AbstractOperator operator, Integer size, String dominion_name) { public static void contract(AbstractOperator operator, Integer size, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "缩小领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "缩小领地失败");

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

@ -1,205 +0,0 @@
package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.minecraftpluginutils.XLogger;
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 玩家
*/
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 领地名称
*/
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.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;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.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;
}
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 权限值
*/
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 领地名称
*/
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.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;
}
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") || privilege.getAdmin()) {
if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他管理员的权限", dominionName));
return;
}
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(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;
}
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;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.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

@ -10,10 +10,14 @@ public class TemplateController {
public static void createTemplate(AbstractOperator operator, String templateName) { public static void createTemplate(AbstractOperator operator, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建成功"); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建成功");
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建失败");
if (templateName.contains(" ")) {
operator.setResponse(FAIL.addMessage("模板名称不能包含空格"));
return;
}
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(operator.getUniqueId()); List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(operator.getUniqueId());
for (PrivilegeTemplateDTO template : templates) { for (PrivilegeTemplateDTO template : templates) {
if (template.getName().equals(templateName)) { if (template.getName().equals(templateName)) {
operator.setResponse(FAIL.addMessage("已经存在名为" + templateName + "的权限模板")); operator.setResponse(FAIL.addMessage("已经存在名为 %s 的权限模板", templateName));
return; return;
} }
} }
@ -22,7 +26,7 @@ public class TemplateController {
operator.setResponse(FAIL.addMessage("可能是数据库错误,请联系管理员")); operator.setResponse(FAIL.addMessage("可能是数据库错误,请联系管理员"));
return; return;
} }
operator.setResponse(SUCCESS.addMessage("成功创建名为" + templateName + "的权限模板")); operator.setResponse(SUCCESS.addMessage("成功创建名为 %s 的权限模板", templateName));
} }
public static void deleteTemplate(AbstractOperator operator, String templateName) { public static void deleteTemplate(AbstractOperator operator, String templateName) {

View File

@ -4,7 +4,7 @@ import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.AbstractOperator; import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.tuis.DominionManage; import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;

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

@ -2,7 +2,7 @@ package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController; import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.tuis.TemplateList; import cn.lunadeer.dominion.tuis.template.TemplateList;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -23,10 +23,8 @@ public class CreateTemplate {
public void handleData(String input) { public void handleData(String input) {
XLogger.debug("createTemplateCB.run: %s", input); XLogger.debug("createTemplateCB.run: %s", input);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
operator.getResponse().thenAccept(result -> {
TemplateList.show(sender, new String[]{"template_list"});
});
TemplateController.createTemplate(operator, input); TemplateController.createTemplate(operator, input);
TemplateList.show(sender);
} }
} }
@ -35,7 +33,7 @@ public class CreateTemplate {
if (player == null) return; if (player == null) return;
CuiTextInput.InputCallback createTemplateCB = new createTemplateCB(player); CuiTextInput.InputCallback createTemplateCB = new createTemplateCB(player);
CuiTextInput view = CuiTextInput.create(createTemplateCB).setText("未命名模板").title("输入模板名称"); CuiTextInput view = CuiTextInput.create(createTemplateCB).setText("未命名模板").title("输入模板名称");
view.setSuggestCommand("/dominion template_create <模板名称>"); view.setSuggestCommand("/dominion template create <模板名称>");
view.open(player); view.open(player);
} }

View File

@ -3,7 +3,7 @@ package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.DominionManage; import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;

View File

@ -3,7 +3,7 @@ package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.DominionManage; import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;

View File

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

View File

@ -2,7 +2,7 @@ package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.tuis.DominionManage; import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

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

@ -3,7 +3,7 @@ package cn.lunadeer.dominion.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.DominionManage; import cn.lunadeer.dominion.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;

View File

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

View File

@ -15,7 +15,7 @@ import java.util.List;
public enum Flag { public enum Flag {
ANCHOR("anchor", "重生锚", "是否允许设置重生锚", false, false, true), ANCHOR("anchor", "重生锚", "是否允许设置重生锚", false, false, true),
ANIMAL_KILLING("animal_killing", "对动物造成伤害", "是否允许对动物造成伤害", 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), ANVIL("anvil", "使用铁砧", "是否允许使用铁砧", false, false, true),
BEACON("beacon", "信标交互", "是否允许与信标交互", false, false, true), BEACON("beacon", "信标交互", "是否允许与信标交互", false, false, true),
BED("bed", "床交互", "是否允许使用床睡觉或设置重生点", false, false, true), BED("bed", "床交互", "是否允许使用床睡觉或设置重生点", false, false, true),
@ -28,13 +28,14 @@ public enum Flag {
CREEPER_EXPLODE("creeper_explode", "实体爆炸", "包含:苦力怕/凋零头颅/水晶爆炸", false, true, true), CREEPER_EXPLODE("creeper_explode", "实体爆炸", "包含:苦力怕/凋零头颅/水晶爆炸", false, true, true),
COMPARER("comparer", "比较器交互", "是否可以修改比较器状态", false, false, true), COMPARER("comparer", "比较器交互", "是否可以修改比较器状态", false, false, true),
DOOR("door", "门交互", "是否可以使用各种材质的门(包括活板门)", false, false, true), DOOR("door", "门交互", "是否可以使用各种材质的门(包括活板门)", false, false, true),
DRAGON_EGG("dragon_egg", "触碰龙蛋", "是否可以触碰龙蛋", false, false, true),
DYE("dye", "染色", "是否可以使用染料(对羊、狗项圈、猫项圈)染色", false, false, true), DYE("dye", "染色", "是否可以使用染料(对羊、狗项圈、猫项圈)染色", false, false, true),
EDIT_SIGN("edit_sign", "编辑告示牌", "是否可以编辑告示牌", false, false, true), EDIT_SIGN("edit_sign", "编辑告示牌", "是否可以编辑告示牌", false, false, true),
EGG("egg", "扔鸡蛋", "是否可以扔鸡蛋", false, false, true), EGG("egg", "扔鸡蛋", "是否可以扔鸡蛋", false, false, true),
ENCHANT("enchant", "使用附魔台", "是否可以使用附魔台", false, false, true), ENCHANT("enchant", "使用附魔台", "是否可以使用附魔台", false, false, true),
ENDER_MAN("ender_man", "末影人行为", "包含:末影人是否可以生成、瞬移", false, true, true), ENDER_MAN("ender_man", "末影人行为", "包含:末影人是否可以生成、瞬移", false, true, true),
ENDER_PEARL("ender_pearl", "投掷末影珍珠", "是否可以使用末影珍珠", false, false, 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), FIRE_SPREAD("fire_spread", "火焰蔓延", "是否可以火焰蔓延", false, true, true),
FLOW_IN_PROTECTION("flow_in_protection", "外部流体是否可以进入", "包含:岩浆、水(不会阻止领地内部的流体蔓延)", false, true, true), FLOW_IN_PROTECTION("flow_in_protection", "外部流体是否可以进入", "包含:岩浆、水(不会阻止领地内部的流体蔓延)", false, true, true),
FLY("fly", "飞行", "不是翅鞘飞行,是类似于创造模式的飞行", false, false, false), FLY("fly", "飞行", "不是翅鞘飞行,是类似于创造模式的飞行", false, false, false),
@ -62,6 +63,8 @@ public enum Flag {
TRAMPLE("trample", "作物践踏", "是否可以践踏作物(关闭意味着保护耕地)", false, true, true), TRAMPLE("trample", "作物践踏", "是否可以践踏作物(关闭意味着保护耕地)", false, true, true),
VEHICLE_DESTROY("vehicle_destroy", "破坏载具", "是否可以破坏载具(主要是矿车)", false, false, true), VEHICLE_DESTROY("vehicle_destroy", "破坏载具", "是否可以破坏载具(主要是矿车)", false, false, true),
VEHICLE_SPAWN("vehicle_spawn", "生成载具", "是否可以生成载具(主要是矿车)", 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), WITHER_SPAWN("wither_spawn", "凋零生成", "凋零生成", false, true, true),
; ;
private final String flag_name; private final String flag_name;

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; 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 org.bukkit.entity.Player;
import javax.annotation.Nullable;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@ -19,6 +26,17 @@ public class PlayerDTO {
return re; 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() { public static List<PlayerDTO> all() {
String sql = "SELECT * FROM player_name WHERE id > 0;"; String sql = "SELECT * FROM player_name WHERE id > 0;";
return query(sql); return query(sql);
@ -31,18 +49,24 @@ public class PlayerDTO {
private static List<PlayerDTO> query(String sql, Object... params) { private static List<PlayerDTO> query(String sql, Object... params) {
List<PlayerDTO> players = new ArrayList<>(); List<PlayerDTO> players = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, params)) { try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
if (rs == null) return players; return getDTOFromRS(rs);
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);
}
} catch (SQLException e) { } 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; return players;
} }
@ -73,24 +97,44 @@ public class PlayerDTO {
} }
private static PlayerDTO insert(PlayerDTO player) { private static PlayerDTO insert(PlayerDTO player) {
String sql = "INSERT INTO player_name (uuid, last_known_name, last_join_at) " + Field uuid = new Field("uuid", player.getUuid().toString());
"VALUES" + Field lastKnownName = new Field("last_known_name", player.getLastKnownName());
" (?, ?, CURRENT_TIMESTAMP) " + Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now()));
"RETURNING *;"; InsertRow insertRow = new InsertRow()
List<PlayerDTO> players = query(sql, player.getUuid().toString(), player.getLastKnownName()); .table("player_name")
if (players.size() == 0) return null; .field(uuid)
return players.get(0); .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) { private static PlayerDTO update(PlayerDTO player) {
String sql = "UPDATE player_name SET " + Field lastKnownName = new Field("last_known_name", player.getLastKnownName());
"last_known_name = ?, " + Field uuid = new Field("uuid", player.getUuid().toString());
"last_join_at = CURRENT_TIMESTAMP " + Field lastJoinAt = new Field("last_join_at", Timestamp.valueOf(LocalDateTime.now()));
"WHERE uuid = ? " + UpdateRow updateRow = new UpdateRow()
"RETURNING *;"; .table("player_name")
List<PlayerDTO> players = query(sql, player.getLastKnownName(), player.getUuid().toString()); .field(lastKnownName)
if (players.size() == 0) return null; .field(lastJoinAt)
return players.get(0); .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) { private PlayerDTO(Integer id, UUID uuid, String lastKnownName, Long lastJoinAt) {

View File

@ -1,168 +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) {
StringBuilder sql = new StringBuilder("INSERT INTO player_privilege (player_uuid, admin, dom_id, ");
for (Flag f : Flag.getAllPrivilegeFlags()) {
sql.append(f.getFlagName()).append(", ");
}
sql = new StringBuilder(sql.substring(0, sql.length() - 2));
sql.append(") VALUES ('")
.append(player.getPlayerUUID()).append("', ")
.append(player.getAdmin()).append(", ")
.append(player.getDomID()).append(", ");
for (Flag f : Flag.getAllPrivilegeFlags()) {
sql.append(player.getFlagValue(f)).append(", ");
}
sql = new StringBuilder(sql.substring(0, sql.length() - 2));
sql.append(") RETURNING *;");
List<PlayerPrivilegeDTO> players = query(sql.toString());
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);
}
public PlayerPrivilegeDTO applyTemplate(PrivilegeTemplateDTO template) {
this.admin = template.getAdmin();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
this.flags.put(f, template.getFlagValue(f));
}
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

@ -1,6 +1,9 @@
package cn.lunadeer.dominion.dtos; 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 java.sql.ResultSet; import java.sql.ResultSet;
import java.util.*; import java.util.*;
@ -9,8 +12,18 @@ public class PrivilegeTemplateDTO {
private static List<PrivilegeTemplateDTO> query(String sql, Object... params) { private static List<PrivilegeTemplateDTO> query(String sql, Object... params) {
List<PrivilegeTemplateDTO> templates = new ArrayList<>(); List<PrivilegeTemplateDTO> templates = new ArrayList<>();
try (ResultSet rs = Dominion.database.query(sql, params)) { try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
if (rs == null) return templates; 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()) { while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>(); Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
@ -26,16 +39,41 @@ public class PrivilegeTemplateDTO {
templates.add(template); templates.add(template);
} }
} catch (Exception e) { } catch (Exception e) {
Dominion.database.handleDatabaseError("查询权限模版失败: ", e, sql); DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, null);
} }
return templates; return templates;
} }
public static PrivilegeTemplateDTO create(UUID creator, String name) { public static PrivilegeTemplateDTO create(UUID creator, String name) {
String sql = "INSERT INTO privilege_template (creator, name) VALUES (?, ?) RETURNING *;"; Field creatorField = new Field("creator", creator.toString());
List<PrivilegeTemplateDTO> templates = query(sql, creator.toString(), name); Field nameField = new Field("name", name);
if (templates.size() == 0) return null; InsertRow insertRow = new InsertRow().table("privilege_template").onConflictDoNothing(new Field("id", null))
return templates.get(0); .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) { public static PrivilegeTemplateDTO select(UUID creator, String name) {
@ -93,25 +131,12 @@ public class PrivilegeTemplateDTO {
public PrivilegeTemplateDTO setFlagValue(Flag flag, Boolean value) { public PrivilegeTemplateDTO setFlagValue(Flag flag, Boolean value) {
flags.put(flag, value); flags.put(flag, value);
return update(this); return doUpdate(new UpdateRow().field(new Field(flag.getFlagName(), value)));
} }
public PrivilegeTemplateDTO setAdmin(Boolean admin) { public PrivilegeTemplateDTO setAdmin(Boolean admin) {
this.admin = admin; this.admin = admin;
return update(this); return doUpdate(new UpdateRow().field(new Field("admin", admin)));
}
private static PrivilegeTemplateDTO update(PrivilegeTemplateDTO template) {
StringBuilder sql = new StringBuilder("UPDATE privilege_template SET " +
"name = ?, " +
"admin = ?, ");
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
sql.append(f.getFlagName()).append(" = ").append(template.getFlagValue(f)).append(", ");
}
sql = new StringBuilder(sql.substring(0, sql.length() - 2) + " WHERE id = ? RETURNING *;");
List<PrivilegeTemplateDTO> templates = query(sql.toString(), template.getName(), template.getAdmin(), template.getId());
if (templates.size() == 0) return null;
return templates.get(0);
} }
} }

View File

@ -4,7 +4,8 @@ import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
@ -16,7 +17,7 @@ import org.bukkit.event.Cancellable;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
public class Apis { 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()) { if (player.isOp() && Dominion.config.getLimitOpBypass()) {
return true; return true;
} }
@ -47,13 +48,23 @@ public class Apis {
if (dom == null) { if (dom == null) {
return true; return true;
} }
PlayerPrivilegeDTO prev = Cache.instance.getPlayerPrivilege(player, dom); MemberDTO prev = Cache.instance.getMember(player, dom);
if (canByPass(player, dom, prev)) { if (canByPass(player, dom, prev)) {
return true; return true;
} }
if (prev != null) { if (prev != null) {
if (prev.getFlagValue(flag)) { if (prev.getGroupId() == -1) {
return true; 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 { } else {
if (dom.getFlagValue(flag)) { if (dom.getFlagValue(flag)) {

View File

@ -97,6 +97,9 @@ public class EnvironmentEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // trample @EventHandler(priority = EventPriority.HIGHEST) // trample
public void onFarmlandTrample(PlayerInteractEvent event) { public void onFarmlandTrample(PlayerInteractEvent event) {
if (event.getAction() != Action.PHYSICAL) {
return;
}
Block block = event.getClickedBlock(); Block block = event.getClickedBlock();
if (block == null) { if (block == null) {
return; return;
@ -104,11 +107,7 @@ public class EnvironmentEvents implements Listener {
if (block.getType() != FARMLAND) { if (block.getType() != FARMLAND) {
return; return;
} }
if (event.getAction() != Action.PHYSICAL) { DominionDTO dom = Cache.instance.getDominion(block.getLocation());
return;
}
Location location = block.getLocation();
DominionDTO dom = Cache.instance.getDominion(location);
checkFlag(dom, Flag.TRAMPLE, event); checkFlag(dom, Flag.TRAMPLE, event);
} }
@ -161,4 +160,14 @@ public class EnvironmentEvents implements Listener {
DominionDTO dom = Cache.instance.getDominion(entity.getLocation()); DominionDTO dom = Cache.instance.getDominion(entity.getLocation());
checkFlag(dom, Flag.ANIMAL_SPAWN, event); 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

@ -8,15 +8,13 @@ import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Teleport; import cn.lunadeer.minecraftpluginutils.Teleport;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.*; import org.bukkit.entity.*;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.*;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityPlaceEvent; import org.bukkit.event.entity.EntityPlaceEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent; 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.player.*;
import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.event.vehicle.VehicleDestroyEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.material.Colorable;
import org.spigotmc.event.entity.EntityMountEvent; import org.spigotmc.event.entity.EntityMountEvent;
import static cn.lunadeer.dominion.events.Apis.checkFlag; import static cn.lunadeer.dominion.events.Apis.checkFlag;
@ -103,9 +102,19 @@ public class PlayerEvents implements Listener {
} }
@EventHandler(priority = EventPriority.HIGHEST) // bed @EventHandler(priority = EventPriority.HIGHEST) // bed
public void onBedUse(PlayerBedEnterEvent event) { public void onBedUse(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
return;
}
Player bukkitPlayer = event.getPlayer(); 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); checkFlag(dom, Flag.BED, bukkitPlayer, event);
} }
@ -156,36 +165,30 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // button @EventHandler(priority = EventPriority.HIGHEST) // button
public void onButton(PlayerInteractEvent event) { public void onButton(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
return;
}
Player player = event.getPlayer(); Player player = event.getPlayer();
if (event.getClickedBlock() == null) { if (event.getClickedBlock() == null) {
return; return;
} }
Material clicked = event.getClickedBlock().getType(); Block block = event.getClickedBlock();
if (clicked != Material.STONE_BUTTON && if (!Tag.BUTTONS.isTagged(block.getType())) {
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) {
return; return;
} }
DominionDTO dom = Cache.instance.getPlayerCurrentDominion(player); DominionDTO dom = Cache.instance.getDominion(block.getLocation());
checkFlag(dom, Flag.BUTTON, player, event); checkFlag(dom, Flag.BUTTON, player, event);
} }
@EventHandler(priority = EventPriority.HIGHEST) // cake @EventHandler(priority = EventPriority.HIGHEST) // cake
public void eatCake(PlayerInteractEvent event) { public void eatCake(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) { if (!event.getAction().isRightClick()) {
return; return;
} }
Block block = event.getClickedBlock(); Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = block.getType(); Material clicked = block.getType();
if (clicked != Material.CAKE) { if (clicked != Material.CAKE) {
return; return;
@ -277,7 +280,11 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // comparer @EventHandler(priority = EventPriority.HIGHEST) // comparer
public void comparerChange(PlayerInteractEvent event) { public void comparerChange(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) { if (!event.getAction().isRightClick()) {
return;
}
Block block = event.getClickedBlock();
if (block == null) {
return; return;
} }
Material clicked = event.getClickedBlock().getType(); Material clicked = event.getClickedBlock().getType();
@ -291,45 +298,14 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // door @EventHandler(priority = EventPriority.HIGHEST) // door
public void doorUse(PlayerInteractEvent event) { public void doorUse(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) { if (!event.getAction().isRightClick()) {
return; return;
} }
Material clicked = event.getClickedBlock().getType(); Block block = event.getClickedBlock();
if (clicked != Material.IRON_DOOR && if (block == null) {
clicked != Material.OAK_DOOR && return;
clicked != Material.SPRUCE_DOOR && }
clicked != Material.BIRCH_DOOR && if (!Tag.DOORS.isTagged(block.getType())) {
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) {
return; return;
} }
Player player = event.getPlayer(); Player player = event.getPlayer();
@ -337,23 +313,53 @@ public class PlayerEvents implements Listener {
checkFlag(dom, Flag.DOOR, player, event); checkFlag(dom, Flag.DOOR, player, event);
} }
@EventHandler(priority = EventPriority.HIGHEST) // dragon_egg
public void touchDragonEdd(PlayerInteractEvent event) {
Block block = event.getClickedBlock();
if (block == null) {
return;
}
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 @EventHandler(priority = EventPriority.HIGHEST) // dye
public void dyeEvent(PlayerInteractEntityEvent event) { public void dyeEvent(PlayerInteractEntityEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
Entity entity = event.getRightClicked(); Entity entity = event.getRightClicked();
if (!(entity instanceof Sheep) if (!(entity instanceof Colorable)) {
&& !(entity instanceof Wolf)
&& !(entity instanceof Cat)) {
return; return;
} }
DominionDTO dom = Cache.instance.getDominion(entity.getLocation()); DominionDTO dom = Cache.instance.getDominion(entity.getLocation());
checkFlag(dom, Flag.DYE, player, event); 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 @EventHandler(priority = EventPriority.HIGHEST) // edit sign
public void onSignEdit(SignChangeEvent event) { public void onSignEdit(SignChangeEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getDominion(event.getBlock().getLocation()); Block block = event.getBlock();
DominionDTO dom = Cache.instance.getDominion(block.getLocation());
checkFlag(dom, Flag.EDIT_SIGN, player, event); checkFlag(dom, Flag.EDIT_SIGN, player, event);
} }
@ -401,6 +407,10 @@ public class PlayerEvents implements Listener {
if (!(event.getRightClicked() instanceof Animals)) { if (!(event.getRightClicked() instanceof Animals)) {
return; return;
} }
// if shearing sheep instead
if (event.getPlayer().getInventory().getItem(event.getHand()).getType() == Material.SHEARS) {
return;
}
Player player = event.getPlayer(); Player player = event.getPlayer();
DominionDTO dom = Cache.instance.getDominion(event.getRightClicked().getLocation()); DominionDTO dom = Cache.instance.getDominion(event.getRightClicked().getLocation());
checkFlag(dom, Flag.FEED, player, event); checkFlag(dom, Flag.FEED, player, event);
@ -434,10 +444,13 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // honey @EventHandler(priority = EventPriority.HIGHEST) // honey
public void honeyInteractive(PlayerInteractEvent event) { public void honeyInteractive(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) { if (!event.getAction().isRightClick()) {
return; return;
} }
Block block = event.getClickedBlock(); Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = block.getType(); Material clicked = block.getType();
if (clicked != Material.BEEHIVE && clicked != Material.BEE_NEST) { if (clicked != Material.BEEHIVE && clicked != Material.BEE_NEST) {
return; return;
@ -489,10 +502,13 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // lever @EventHandler(priority = EventPriority.HIGHEST) // lever
public void onLever(PlayerInteractEvent event) { public void onLever(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) { if (!event.getAction().isRightClick()) {
return; return;
} }
Block block = event.getClickedBlock(); Block block = event.getClickedBlock();
if (block == null) {
return;
}
Material clicked = block.getType(); Material clicked = block.getType();
if (clicked != Material.LEVER) { if (clicked != Material.LEVER) {
return; return;
@ -591,26 +607,14 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // pressure @EventHandler(priority = EventPriority.HIGHEST) // pressure
public void onPressure(PlayerInteractEvent event) { public void onPressure(PlayerInteractEvent event) {
if (event.getClickedBlock() == null) { if (event.getAction() != Action.PHYSICAL) {
return; return;
} }
Block block = event.getClickedBlock(); Block block = event.getClickedBlock();
Material clicked = block.getType(); if (block == null) {
if (clicked != Material.STONE_PRESSURE_PLATE && return;
clicked != Material.LIGHT_WEIGHTED_PRESSURE_PLATE && }
clicked != Material.HEAVY_WEIGHTED_PRESSURE_PLATE && if (!Tag.PRESSURE_PLATES.isTagged(block.getType())) {
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) {
return; return;
} }
Player player = event.getPlayer(); Player player = event.getPlayer();
@ -701,4 +705,17 @@ public class PlayerEvents implements Listener {
DominionDTO dom = Cache.instance.getDominion(entity.getLocation()); DominionDTO dom = Cache.instance.getDominion(entity.getLocation());
checkFlag(dom, Flag.VEHICLE_SPAWN, player, event); 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

@ -83,6 +83,7 @@ public class ConfigManager {
_economy_only_xz = _file.getBoolean("Economy.OnlyXZ", false); _economy_only_xz = _file.getBoolean("Economy.OnlyXZ", false);
_economy_refund = (float) _file.getDouble("Economy.Refund", 0.85); _economy_refund = (float) _file.getDouble("Economy.Refund", 0.85);
_fly_permission_nodes = _file.getStringList("FlyPermissionNodes"); _fly_permission_nodes = _file.getStringList("FlyPermissionNodes");
_residence_migration = _file.getBoolean("ResidenceMigration", false);
saveAll(); // 回写文件 防止文件中的数据不完整 saveAll(); // 回写文件 防止文件中的数据不完整
Flag.loadFromJson(); Flag.loadFromJson();
} }
@ -111,6 +112,7 @@ public class ConfigManager {
_file.set("Economy.OnlyXZ", _economy_only_xz); _file.set("Economy.OnlyXZ", _economy_only_xz);
_file.set("Economy.Refund", _economy_refund); _file.set("Economy.Refund", _economy_refund);
_file.set("FlyPermissionNodes", _fly_permission_nodes); _file.set("FlyPermissionNodes", _fly_permission_nodes);
_file.set("ResidenceMigration", _residence_migration);
_plugin.saveConfig(); _plugin.saveConfig();
} }
@ -388,6 +390,16 @@ public class ConfigManager {
_plugin.saveConfig(); _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 final Dominion _plugin;
private FileConfiguration _file; private FileConfiguration _file;
private Boolean _debug; private Boolean _debug;
@ -426,4 +438,5 @@ public class ConfigManager {
private Boolean _economy_only_xz; private Boolean _economy_only_xz;
private Float _economy_refund; private Float _economy_refund;
private List<String> _fly_permission_nodes; private List<String> _fly_permission_nodes;
private Boolean _residence_migration;
} }

View File

@ -1,107 +1,235 @@
package cn.lunadeer.dominion.managers; package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.Flag; 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 class DatabaseTables {
public static void migrate() { public static void migrate() {
String sql = "";
// player name // player name
sql = "CREATE TABLE IF NOT EXISTS player_name (" + TableColumn player_name_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
" id SERIAL PRIMARY KEY," + TableColumn player_name_uuid = new TableColumn("uuid", FieldType.STRING, false, false, true, true, "''");
" uuid VARCHAR(36) NOT NULL UNIQUE," + TableColumn player_name_last_known_name = new TableColumn("last_known_name", FieldType.STRING, false, false, true, false, "'unknown'");
" last_known_name TEXT NOT NULL," + TableColumn player_name_last_join_at = new TableColumn("last_join_at", FieldType.DATETIME, false, false, true, false, "CURRENT_TIMESTAMP");
" last_join_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP" + CreateTable player_name = new CreateTable().ifNotExists();
");"; player_name.table("player_name")
Dominion.database.query(sql); .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 // dominion table
sql = "CREATE TABLE IF NOT EXISTS dominion (" + TableColumn dominion_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
" id SERIAL PRIMARY KEY," + TableColumn dominion_owner = new TableColumn("owner", FieldType.STRING, false, false, true, false, "''");
" owner VARCHAR(36) NOT NULL," + TableColumn dominion_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'");
" name TEXT NOT NULL UNIQUE," + TableColumn dominion_world = new TableColumn("world", FieldType.STRING, false, false, true, false, "'world'");
" world TEXT NOT NULL," + TableColumn dominion_x1 = new TableColumn("x1", FieldType.INT, false, false, true, false, 0);
" x1 INT NOT NULL," + TableColumn dominion_y1 = new TableColumn("y1", FieldType.INT, false, false, true, false, 0);
" y1 INT NOT NULL," + TableColumn dominion_z1 = new TableColumn("z1", FieldType.INT, false, false, true, false, 0);
" z1 INT NOT NULL," + TableColumn dominion_x2 = new TableColumn("x2", FieldType.INT, false, false, true, false, 0);
" x2 INT NOT NULL," + TableColumn dominion_y2 = new TableColumn("y2", FieldType.INT, false, false, true, false, 0);
" y2 INT NOT NULL," + TableColumn dominion_z2 = new TableColumn("z2", FieldType.INT, false, false, true, false, 0);
" z2 INT NOT NULL," + TableColumn dominion_parent_dom_id = new TableColumn("parent_dom_id", FieldType.INT, false, false, true, false, -1);
" parent_dom_id INT NOT NULL DEFAULT -1," + TableColumn dominion_join_message = new TableColumn("join_message", FieldType.STRING, false, false, true, false, "'欢迎'");
" join_message TEXT NOT NULL DEFAULT '欢迎', " + TableColumn dominion_leave_message = new TableColumn("leave_message", FieldType.STRING, false, false, true, false, "'再见'");
" leave_message TEXT NOT NULL DEFAULT '再见', " + 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);
" FOREIGN KEY (owner) REFERENCES player_name(uuid) ON DELETE CASCADE," + CreateTable dominion = new CreateTable().ifNotExists();
" FOREIGN KEY (parent_dom_id) REFERENCES dominion(id) ON DELETE CASCADE" + dominion.table("dominion")
");"; .field(dominion_id)
Dominion.database.query(sql); .field(dominion_owner)
.field(dominion_name)
// player privilege .field(dominion_world)
sql = "CREATE TABLE IF NOT EXISTS player_privilege (" + .field(dominion_x1)
" id SERIAL PRIMARY KEY," + .field(dominion_y1)
" player_uuid VARCHAR(36) NOT NULL," + .field(dominion_z1)
" dom_id INT NOT NULL," + .field(dominion_x2)
.field(dominion_y2)
" admin BOOLEAN NOT NULL DEFAULT FALSE," + .field(dominion_z2)
.field(dominion_parent_dom_id)
" UNIQUE (player_uuid, dom_id)," + .field(dominion_join_message)
" FOREIGN KEY (player_uuid) REFERENCES player_name(uuid) ON DELETE CASCADE," + .field(dominion_leave_message)
" FOREIGN KEY (dom_id) REFERENCES dominion(id) ON DELETE CASCADE" + .foreignKey(dominion_owner_fk)
");"; .foreignKey(dominion_parent_dom_id_fk);
Dominion.database.query(sql); dominion.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);
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);
for (Flag flag : Flag.getAllDominionFlags()) { for (Flag flag : Flag.getAllDominionFlags()) {
Dominion.database.addColumnIfNotExists("dominion", TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
flag.getFlagName(), new AddColumn(column).table("dominion").ifNotExists().execute();
"BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue());
} }
// player privilege
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();
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();
}
}
// 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();
// 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();
// 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.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();
for (Flag flag : Flag.getAllPrivilegeFlags()) { for (Flag flag : Flag.getAllPrivilegeFlags()) {
Dominion.database.addColumnIfNotExists("player_privilege", TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
flag.getFlagName(), new AddColumn(column).table("privilege_template").ifNotExists().execute();
"BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue());
} }
// 1.18.0 // 1.31.6 dominion add blue-map tile color
Dominion.database.addColumnIfNotExists("dominion", "tp_location", "TEXT NOT NULL DEFAULT 'default'"); TableColumn dominion_color = new TableColumn("color", FieldType.STRING, false, false, true, false, "'#00BFFF'");
new AddColumn(dominion_color).table("dominion").ifNotExists().execute();
// 1.31.0 // 1.34.0 add dominion_group
sql = "CREATE TABLE IF NOT EXISTS privilege_template (" + if (!Common.IsTableExist("dominion_member")) {
" id SERIAL PRIMARY KEY," + TableColumn player_privilege_group_id = new TableColumn("group_id", FieldType.INT, false, false, true, false, -1);
" creator VARCHAR(36) NOT NULL," + new AddColumn(player_privilege_group_id).table("player_privilege").ifNotExists().execute();
" name TEXT NOT NULL," + }
" admin BOOLEAN NOT NULL DEFAULT FALSE," +
" UNIQUE (creator, name)," +
" FOREIGN KEY (creator) REFERENCES player_name(uuid) ON DELETE CASCADE" +
");";
Dominion.database.query(sql);
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()) { for (Flag flag : Flag.getAllPrivilegeFlags()) {
Dominion.database.addColumnIfNotExists("privilege_template", TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
flag.getFlagName(), new AddColumn(column).table("dominion_group").ifNotExists().execute();
"BOOLEAN NOT NULL DEFAULT " + flag.getDefaultValue());
} }
// 1.31.6 // 1.35.0 migrate player_privilege -> dominion_member
Dominion.database.addColumnIfNotExists("dominion", "color", "TEXT NOT NULL DEFAULT '#00BFFF'"); 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

@ -13,7 +13,7 @@ import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage; import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.notOp; import static cn.lunadeer.dominion.tuis.Apis.notOp;
import static cn.lunadeer.dominion.tuis.ListDominion.BuildTreeLines; import static cn.lunadeer.dominion.tuis.dominion.DominionList.BuildTreeLines;
public class AllDominion { public class AllDominion {
@ -21,7 +21,7 @@ public class AllDominion {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (notOp(player)) return; if (notOp(player)) return;
int page = getPage(args); int page = getPage(args, 1);
List<DominionNode> allDominions = Cache.instance.getAllDominionTree(); List<DominionNode> allDominions = Cache.instance.getAllDominionTree();

View File

@ -2,7 +2,7 @@ package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -14,11 +14,11 @@ import static cn.lunadeer.dominion.commands.Apis.playerOnly;
public class Apis { public class Apis {
public static int getPage(String[] args) { public static int getPage(String[] args, int pos) {
int page = 1; int page = 1;
if (args.length == 2) { if (args.length > pos) {
try { try {
page = Integer.parseInt(args[1]); page = Integer.parseInt(args[pos]);
} catch (Exception e) { } catch (Exception e) {
return 1; return 1;
} }
@ -42,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) { public static boolean noAuthToManage(Player player, DominionDTO dominion) {
if (player.isOp()) return false; if (player.isOp()) return false;
if (!dominion.getOwner().equals(player.getUniqueId())) { if (!dominion.getOwner().equals(player.getUniqueId())) {
PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId()); MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId());
if (privileges == null || !privileges.getAdmin()) { if (privileges == null || !privileges.getAdmin()) {
Notification.error(player, "你不是领地 %s 的拥有者或管理员,无权访问此页面", dominion.getName()); Notification.error(player, "你不是领地 %s 的拥有者或管理员,无权访问此页面", dominion.getName());
return true; return true;
@ -81,11 +65,11 @@ public class Apis {
public static void printHelp(CommandSender sender, String[] args) { public static void printHelp(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
int page = getPage(args); int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion help"); ListView view = ListView.create(10, "/dominion help");
view.title("领地插件命令帮助 <>表示必填参数 []表示可选参数") view.title("领地插件命令帮助 <>表示必填参数 []表示可选参数")
.add(Line.create().append("打开交互菜单").append(Button.create("/dominion menu").setExecuteCommand("/dominion menu").build())) .add(Line.create().append("打开交互菜单").append("/dominion menu"))
.add(Line.create().append("查看帮助").append(Button.create("/dominion help [页码]").setExecuteCommand("/dominion help 1").build())) .add(Line.create().append("查看帮助").append("/dominion help [页码]"))
.add(Line.create().append("创建领地").append("/dominion create <领地名称>")) .add(Line.create().append("创建领地").append("/dominion create <领地名称>"))
.add(Line.create().append("自动创建领地").append("/dominion auto_create <领地名称>")) .add(Line.create().append("自动创建领地").append("/dominion auto_create <领地名称>"))
.add(Line.create().append("创建子领地").append("/dominion create_sub <子领地名称> [父领地名称]")) .add(Line.create().append("创建子领地").append("/dominion create_sub <子领地名称> [父领地名称]"))
@ -104,18 +88,6 @@ public class Apis {
.add(Line.create().append("---[管理员指令]---")) .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_cache").setExecuteCommand("/dominion reload_cache").build()))
.add(Line.create().append("重载配置").append(Button.create("/dominion reload_config").setExecuteCommand("/dominion reload_config").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); .showOn(player, page);
} }

View File

@ -1,91 +0,0 @@
package cn.lunadeer.dominion.tuis;
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.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.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();
if (privilege.getAdmin()) {
line.append(adminTag);
} else {
if (!privilege.getFlagValue(Flag.MOVE)) {
line.append(banTag);
} else {
line.append(normalTag);
}
}
line.append(Button.createGreen("权限")
.setHoverText("配置成员权限")
.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("移除")
.setHoverText("将此成员移出(变为访客)")
.setExecuteCommand("/dominion clear_privilege " + p_player.getLastKnownName() + " " + dominion.getName() + " b").build());
line.append(Button.createGreen("模板")
.setHoverText("套用权限模板")
.setExecuteCommand("/dominion select_template " + p_player.getLastKnownName() + " " + dominion.getName() + " " + page).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("这是一个黑名单成员"));
}

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.ViewStyles; import cn.lunadeer.minecraftpluginutils.stui.ViewStyles;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -30,7 +31,7 @@ public class Menu {
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append("查看我的领地"); .append("查看我的领地");
Line template = Line.create() Line template = Line.create()
.append(Button.create("模板列表").setExecuteCommand("/dominion template_list").build()) .append(Button.create("模板列表").setExecuteCommand("/dominion template list").build())
.append("成员权限模板列表"); .append("成员权限模板列表");
Line help = Line.create() Line help = Line.create()
.append(Button.create("指令帮助").setExecuteCommand("/dominion help").build()) .append(Button.create("指令帮助").setExecuteCommand("/dominion help").build())
@ -38,6 +39,9 @@ public class Menu {
Line link = Line.create() Line link = Line.create()
.append(Button.create("使用文档").setOpenURL("https://ssl.lunadeer.cn:14448/doc/23/").build()) .append(Button.create("使用文档").setOpenURL("https://ssl.lunadeer.cn:14448/doc/23/").build())
.append("在浏览器中打开使用文档"); .append("在浏览器中打开使用文档");
Line migrate = Line.create()
.append(Button.create("迁移数据").setExecuteCommand("/dominion migrate_list").build())
.append("把你的领地从Residence迁移到Dominion");
Line all = Line.create() Line all = Line.create()
.append(Button.create("所有领地").setExecuteCommand("/dominion all_dominion").build()) .append(Button.create("所有领地").setExecuteCommand("/dominion all_dominion").build())
.append("查看所有领地"); .append("查看所有领地");
@ -58,6 +62,9 @@ public class Menu {
.add(template) .add(template)
.add(help) .add(help)
.add(link); .add(link);
if (Dominion.config.getResidenceMigration()) {
view.add(migrate);
}
if (player.isOp()) { if (player.isOp()) {
view.add(Line.create().append("")); view.add(Line.create().append(""));
view.add(Line.create().append(Component.text("--- 以下选项仅OP可见 ---", ViewStyles.main_color))); view.add(Line.create().append(Component.text("--- 以下选项仅OP可见 ---", ViewStyles.main_color)));

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

@ -15,13 +15,13 @@ import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage; import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.notOp; import static cn.lunadeer.dominion.tuis.Apis.notOp;
public class DominionConfig { public class SysConfig {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (notOp(player)) return; if (notOp(player)) return;
int page = getPage(args); int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion config"); ListView view = ListView.create(10, "/dominion sys_config");
view.title("系统配置"); view.title("系统配置");
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("系统配置")); view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("系统配置"));
@ -151,6 +151,15 @@ public class DominionConfig {
.append(NumChanger.create(Dominion.config.getEconomyRefund(), "/dominion set_config economy_refund", 0.01).setPageNumber(page).build()); .append(NumChanger.create(Dominion.config.getEconomyRefund(), "/dominion set_config economy_refund", 0.01).setPageNumber(page).build());
view.add(refund); 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.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.Cache;
import cn.lunadeer.dominion.DominionNode; import cn.lunadeer.dominion.DominionNode;
@ -18,11 +18,11 @@ import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.commands.Helper.playerAdminDominions; import static cn.lunadeer.dominion.commands.Helper.playerAdminDominions;
import static cn.lunadeer.dominion.tuis.Apis.getPage; import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class ListDominion { public class DominionList {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
int page = getPage(args); int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion list"); ListView view = ListView.create(10, "/dominion list");
view.title("我的领地列表"); view.title("我的领地列表");
@ -47,11 +47,11 @@ public class ListDominion {
prefix.append(" | "); prefix.append(" | ");
} }
for (DominionNode node : dominionTree) { for (DominionNode node : dominionTree) {
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.dominion.getName()).build(); TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.getDominion().getName()).build();
TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.dominion.getName()).build(); TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.getDominion().getName()).build();
Line line = Line.create().append(delete).append(manage).append(prefix + node.dominion.getName()); Line line = Line.create().append(delete).append(manage).append(prefix + node.getDominion().getName());
lines.add(line); lines.add(line);
lines.addAll(BuildTreeLines(node.children, depth + 1)); lines.addAll(BuildTreeLines(node.getChildren(), depth + 1));
} }
return lines; return lines;
} }

View File

@ -1,4 +1,4 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.tuis.dominion;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
@ -12,8 +12,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_1; import static cn.lunadeer.dominion.tuis.Apis.*;
import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
public class DominionManage { public class DominionManage {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
@ -25,18 +24,22 @@ public class DominionManage {
return; return;
} }
if (noAuthToManage(player, dominion)) return; if (noAuthToManage(player, dominion)) return;
int page = getPage(args, 2);
Line size_info = Line.create() Line size_info = Line.create()
.append(Button.create("详细信息").setExecuteCommand("/dominion info " + dominion.getName()).build()) .append(Button.create("详细信息").setExecuteCommand("/dominion info " + dominion.getName()).build())
.append("查看领地详细信息"); .append("查看领地详细信息");
Line env_info = Line.create() Line env_info = Line.create()
.append(Button.create("环境设置").setExecuteCommand("/dominion env_info " + dominion.getName()).build()) .append(Button.create("环境设置").setExecuteCommand("/dominion env_setting " + dominion.getName()).build())
.append("设置领地内的一些非玩家相关效果"); .append("设置领地内的一些非玩家相关效果");
Line flag_info = Line.create() 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("访客在此领地的权限"); .append("访客在此领地的权限");
Line privilege_list = Line.create() 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("管理此领地成员的权限"); .append("管理此领地成员的权限");
Line group_list = Line.create()
.append(Button.create("权限组").setExecuteCommand("/dominion group list " + dominion.getName()).build())
.append("管理此领地的权限组");
Line set_tp = Line.create() Line set_tp = Line.create()
.append(Button.create("设置传送点").setExecuteCommand("/dominion set_tp_location " + dominion.getName()).build()) .append(Button.create("设置传送点").setExecuteCommand("/dominion set_tp_location " + dominion.getName()).build())
.append("设置当前位置为此领地传送点"); .append("设置当前位置为此领地传送点");
@ -64,6 +67,7 @@ public class DominionManage {
.add(env_info) .add(env_info)
.add(flag_info) .add(flag_info)
.add(privilege_list) .add(privilege_list)
.add(group_list)
.add(set_tp) .add(set_tp)
.add(rename) .add(rename)
.add(join_msg) .add(join_msg)
@ -71,6 +75,6 @@ public class DominionManage {
if (Dominion.config.getBlueMap()) { if (Dominion.config.getBlueMap()) {
view.add(map_color); view.add(map_color);
} }
view.showOn(player, 1); 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.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
@ -11,29 +11,24 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class DominionEnvInfo { public class EnvSetting {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion env_info <领地名称> [页码]"); Notification.error(sender, "用法: /dominion env_setting <领地名称> [页码]");
return; return;
} }
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]); DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[1]); Notification.error(sender, "领地 %s 不存在", args[1]);
return; return;
} }
int page = 1; int page = getPage(args, 2);
if (args.length == 3) { ListView view = ListView.create(10, "/dominion env_setting " + dominion.getName());
try {
page = Integer.parseInt(args[2]);
} catch (Exception ignored) {
}
}
ListView view = ListView.create(10, "/dominion env_info " + dominion.getName());
view.title("领地 " + dominion.getName() + " 环境设置") view.title("领地 " + dominion.getName() + " 环境设置")
.navigator(Line.create() .navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())

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.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
@ -11,29 +11,24 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly; 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) { public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion flag_info <领地名称> [页码]"); Notification.error(sender, "用法: /dominion guest_setting <领地名称> [页码]");
return; return;
} }
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]); DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[1]); Notification.error(sender, "领地 %s 不存在", args[1]);
return; return;
} }
int page = 1; int page = getPage(args, 2);
if (args.length == 3) { ListView view = ListView.create(10, "/dominion guest_setting " + dominion.getName());
try {
page = Integer.parseInt(args[2]);
} catch (Exception ignored) {
}
}
ListView view = ListView.create(10, "/dominion flag_info " + dominion.getName());
view.title("领地 " + dominion.getName() + " 访客权限") view.title("领地 " + dominion.getName() + " 访客权限")
.navigator(Line.create() .navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())

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.Dominion;
import cn.lunadeer.dominion.controllers.PlayerController; 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.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_1; import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_1;
public class DominionSizeInfo { public class SizeInfo {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
@ -47,7 +47,7 @@ public class DominionSizeInfo {
)) ))
.actionBar(Line.create() .actionBar(Line.create()
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) .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); .showOn(player);
ParticleRender.showBoxFace(Dominion.instance, player, ParticleRender.showBoxFace(Dominion.instance, player,
dominion.getLocation1(), 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.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -13,35 +13,40 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly; 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; import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
public class PrivilegeInfo { public class MemberSetting {
// /dominion privilege_info <玩家名称> [领地名称] [页码] 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) { public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender); if (args.length < 3) {
if (player == null) return; Notification.error(sender, "用法: /dominion member setting <领地名称> <玩家名称> [页码]");
DominionDTO dominion = getDominionNameArg_2(player, args); return;
int page = 1; }
if (args.length == 4) { Player player = playerOnly(sender);
try { if (player == null) return;
page = Integer.parseInt(args[3]); DominionDTO dominion = DominionDTO.select(args[2]);
} catch (Exception ignored) { if (dominion == null) {
} Notification.error(sender, "领地 %s 不存在", args[2]);
}
String playerName = args[1];
if (dominion == null) {
Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion privilege_info <玩家名称> [领地名称]");
return; return;
} }
ListView view = ListView.create(10, "/dominion privilege_info " + playerName + " " + dominion.getName());
if (noAuthToManage(player, dominion)) return; 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); PlayerDTO playerDTO = PlayerDTO.select(playerName);
if (playerDTO == null) { if (playerDTO == null) {
Notification.error(sender, "玩家 %s 不存在", playerName); Notification.error(sender, "玩家 %s 不存在", playerName);
return; return;
} }
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(playerDTO.getUuid(), dominion.getId()); MemberDTO privilege = MemberDTO.select(playerDTO.getUuid(), dominion.getId());
if (privilege == null) { if (privilege == null) {
Notification.warn(sender, "玩家 %s 不是领地 %s 的成员", playerName, dominion.getName()); Notification.warn(sender, "玩家 %s 不是领地 %s 的成员", playerName, dominion.getName());
return; return;
@ -52,20 +57,28 @@ public class PrivilegeInfo {
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).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("成员权限") .append("成员权限")
); );
view.add(Line.create().append(Button.createGreen("套用模板")
.setHoverText("选择一个权限模板套用")
.setExecuteCommand("/dominion member select_template " + dominion.getName() + " " + playerName).build()));
if (privilege.getAdmin()) { if (privilege.getAdmin()) {
view.add(Line.create() 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("管理员")); .append("管理员"));
view.add(createOption(Flag.GLOW, privilege.getFlagValue(Flag.GLOW), playerName, dominion.getName(), page));
} else { } else {
view.add(Line.create() 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("管理员")); .append("管理员"));
} for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page));
view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page)); }
} }
view.showOn(player, 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) { private static Line createOption(Flag flag, boolean value, String player_name, String dominion_name, int page) {
if (value) { if (value) {
return Line.create() 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()))); .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
} else { } else {
return Line.create() 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()))); .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.controllers.PlayerController;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line; import cn.lunadeer.minecraftpluginutils.stui.components.Line;
@ -10,26 +11,29 @@ import org.bukkit.entity.Player;
import java.util.List; 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.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class SelectPlayer { 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) { public static void show(CommandSender sender, String[] args) {
if (args.length < 3) {
Notification.error(sender, "用法: /dominion member select_player <领地名称> [页码]");
return;
}
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
int page = 1; int page = getPage(args, 3);
if (args.length == 3) { String dominion_name = args[2];
try { ListView view = ListView.create(10, "/dominion member select_player " + dominion_name);
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);
Line sub = Line.create() Line sub = Line.create()
.append("只能选择已经登录过的玩家") .append("只能选择已经登录过的玩家")
.append(Button.create("搜索").setExecuteCommand("/dominion cui_create_privilege " + dominion_name).build()) .append(Button.create("搜索").setExecuteCommand("/dominion cui_member_add " + dominion_name).build())
.append(Button.create("返回").setExecuteCommand("/dominion privilege_list " + dominion_name).build()); .append(Button.create("返回").setExecuteCommand("/dominion member list " + dominion_name).build());
view.title("选择玩家添加为成员").subtitle(sub); view.title("选择玩家添加为成员").subtitle(sub);
List<PlayerDTO> players = PlayerController.allPlayers(); List<PlayerDTO> players = PlayerController.allPlayers();
for (PlayerDTO p : players) { for (PlayerDTO p : players) {
@ -38,7 +42,7 @@ public class SelectPlayer {
} }
view.add(Line.create(). view.add(Line.create().
append(Button.create(p.getLastKnownName()) 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())); .build()));
} }
view.showOn(player, page); view.showOn(player, page);

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.tuis.dominion.manage.member;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line; import cn.lunadeer.minecraftpluginutils.stui.components.Line;
@ -10,40 +11,42 @@ import org.bukkit.entity.Player;
import java.util.List; 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.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class SelectTemplate { public class SelectTemplate {
public static void show(CommandSender sender, String[] args) { 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); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
String playerName = args[1];
String dominionName = args[2]; String dominionName = args[2];
String backPage = args[3]; String playerName = args[3];
int page = 1;
if (args.length == 5) { int page = getPage(args, 4);
try {
page = Integer.parseInt(args[4]);
} catch (Exception ignored) {
}
}
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
ListView view = ListView.create(10, "/dominion select_template " + playerName + " " + dominionName + " " + backPage); ListView view = ListView.create(10, "/dominion member select_template " + dominionName + " " + playerName);
view.title("选择一个模板"); view.title("选择一个模板");
Line sub = Line.create() Line sub = Line.create()
.append("套用在领地 " + dominionName + " 的成员 " + playerName + " 身上") .append("套用在领地 " + dominionName + " 的成员 " + playerName + " 身上")
.append(Button.create("返回").setExecuteCommand("/dominion privilege_list " + dominionName + " " + backPage).build()); .append(Button.create("返回").setExecuteCommand("/dominion member setting " + dominionName + " " + playerName).build());
view.subtitle(sub); view.subtitle(sub);
for (PrivilegeTemplateDTO template : templates) { for (PrivilegeTemplateDTO template : templates) {
// /dominion apply_template <玩家名称> <领地名称> <模板名称> // /dominion member apply_template <领地名称> <成员名称> <模板名称>
view.add(Line.create() view.add(Line.create()
.append(Button.create("选择") .append(Button.create("选择")
.setExecuteCommand("/dominion apply_template " + playerName + " " + dominionName + " " + template.getName() + " " + backPage) .setExecuteCommand(CommandParser("/dominion member apply_template %s %s %s", dominionName, playerName, template.getName()))
.build()) .build())
.append(Component.text(template.getName()))); .append(Component.text(template.getName())));
} }

View File

@ -1,10 +1,9 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.tuis.template;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line; import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -15,11 +14,19 @@ import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class TemplateList { 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) { public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
int page = getPage(args); int page = getPage(args, 2);
ListView view = ListView.create(10, "/dominion template_list"); ListView view = ListView.create(10, "/dominion template list");
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
view.title("成员权限模板列表"); view.title("成员权限模板列表");
@ -31,8 +38,8 @@ public class TemplateList {
view.add(Line.create().append(create.build())); view.add(Line.create().append(create.build()));
for (PrivilegeTemplateDTO template : templates) { for (PrivilegeTemplateDTO template : templates) {
Button manage = Button.createGreen("配置").setExecuteCommand("/dominion template_manage " + template.getName()); Button manage = Button.createGreen("配置").setExecuteCommand("/dominion template setting " + template.getName());
Button delete = Button.createRed("删除").setExecuteCommand("/dominion template_delete " + template.getName()); Button delete = Button.createRed("删除").setExecuteCommand("/dominion template delete " + template.getName());
Line line = Line.create() Line line = Line.create()
.append(delete.build()) .append(delete.build())
.append(manage.build()) .append(manage.build())

View File

@ -1,4 +1,4 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.tuis.template;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
@ -10,35 +10,35 @@ import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly; import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage; import static cn.lunadeer.dominion.tuis.Apis.getPage;
public class TemplateManage { 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});
}
// /dominion template_manage <模板名称> [页码]
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
int page = 1; int page = getPage(args, 3);
if (args.length == 3) { PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[2]);
try {
page = Integer.parseInt(args[2]);
} catch (Exception ignored) {
}
}
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[1]);
if (template == null) { if (template == null) {
Notification.error(sender, "模板 %s 不存在", args[1]); Notification.error(sender, "模板 %s 不存在", args[2]);
return; return;
} }
ListView view = ListView.create(10, "/dominion template_manage " + template.getName()); ListView view = ListView.create(10, "/dominion template manage " + template.getName());
view.title("模板 " + args[1] + " 权限管理"); view.title("模板 " + args[1] + " 权限管理");
view.navigator(Line.create() view.navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("模板列表").setExecuteCommand("/dominion template_list").build()) .append(Button.create("模板列表").setExecuteCommand("/dominion template list").build())
.append("模板管理") .append("模板管理")
); );
@ -46,11 +46,11 @@ public class TemplateManage {
if (template.getAdmin()) { if (template.getAdmin()) {
view.add(Line.create() view.add(Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion template_set_flag " + template.getName() + " admin false " + page).build()) .append(Button.createGreen("").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin false " + page).build())
.append("管理员")); .append("管理员"));
} else { } else {
view.add(Line.create() view.add(Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion template_set_flag " + template.getName() + " admin true " + page).build()) .append(Button.createRed("").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin true " + page).build())
.append("管理员")); .append("管理员"));
} }
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
@ -62,11 +62,11 @@ public class TemplateManage {
private static Line createOption(Flag flag, boolean value, String templateName, int page) { private static Line createOption(Flag flag, boolean value, String templateName, int page) {
if (value) { if (value) {
return Line.create() return Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion template_set_flag " + templateName + " " + flag.getFlagName() + " false " + page).build()) .append(Button.createGreen("").setExecuteCommand("/dominion template set_flag " + templateName + " " + flag.getFlagName() + " false " + page).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); .append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription())));
} else { } else {
return Line.create() return Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion template_set_flag " + templateName + " " + flag.getFlagName() + " true " + page).build()) .append(Button.createRed("").setExecuteCommand("/dominion template set_flag " + templateName + " " + flag.getFlagName() + " true " + page).build())
.append(Component.text(flag.getDisplayName()).hoverEvent(Component.text(flag.getDescription()))); .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: Database:
Type: sqlite # pgsql, sqlite Type: sqlite # pgsql, sqlite, mysql
Host: localhost Host: localhost
Port: 5432 Port: 5432
Name: dominion Name: dominion
@ -49,6 +49,9 @@ FlyPermissionNodes:
- essentials.fly - essentials.fly
- cmi.command.fly - cmi.command.fly
# 是否允许玩家从 Residence 迁移领地数据
ResidenceMigration: false
BlueMap: true BlueMap: true
CheckUpdate: true CheckUpdate: true