Compare commits

...

10 Commits

Author SHA1 Message Date
zhangyuheng f08e0f51e2 修复了由于调用了paper特殊api导致在spigot下有概率报错问题
Java CI-CD with Maven / build (push) Successful in 28m59s Details
2024-07-05 11:53:04 +08:00
zhangyuheng 6a3f9fbd20 修复了创建领地时领地列表结构不自动分级问题
Java CI-CD with Maven / build (push) Successful in 28m32s Details
2024-07-04 14:55:17 +08:00
zhangyuheng 26f87ab835 将经济系统初始化移动到配置文件加载中,现在即便重载配置也能hook经济系统
Java CI-CD with Maven / build (push) Successful in 8m23s Details
2024-07-04 13:40:25 +08:00
zhangyuheng a119cf747f 新增数据库类型bstats统计(匿名)
Java CI-CD with Maven / build (push) Successful in 9m33s Details
2024-07-04 10:22:14 +08:00
zhangyuheng 4498267c50 修复提示错误 2024-07-04 10:13:18 +08:00
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
25 changed files with 287 additions and 205 deletions

View File

@ -6,7 +6,7 @@
<groupId>cn.lunadeer</groupId>
<artifactId>Dominion</artifactId>
<version>1.34.5-beta</version>
<version>1.35.4-beta</version>
<packaging>jar</packaging>
<name>Dominion</name>

View File

@ -24,8 +24,8 @@ public class Cache {
public Cache() {
player_current_dominion_id = new HashMap<>();
loadDominions();
loadPlayerPrivileges();
loadGroup();
loadMembers();
loadGroups();
}
/**
@ -104,71 +104,71 @@ public class Cache {
*
* @param player_uuid 玩家UUID
*/
public void loadPlayerPrivileges(UUID player_uuid) {
if (_last_update_privilege.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
XLogger.debug("run loadPlayerPrivilegesExecution directly");
loadPlayerPrivilegesExecution(player_uuid);
public void loadMembers(UUID player_uuid) {
if (_last_update_member.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
XLogger.debug("run loadMembersExecution directly");
loadMembersExecution(player_uuid);
} else {
if (_update_privilege_is_scheduled.get()) return;
XLogger.debug("schedule loadPlayerPrivilegesExecution");
_update_privilege_is_scheduled.set(true);
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_privilege.get())) / 1000 * 20L;
if (_update_member_is_scheduled.get()) return;
XLogger.debug("schedule loadMembersExecution");
_update_member_is_scheduled.set(true);
long delay_tick = (UPDATE_INTERVAL - (System.currentTimeMillis() - _last_update_member.get())) / 1000 * 20L;
Scheduler.runTaskLaterAsync(() -> {
XLogger.debug("run loadPlayerPrivilegesExecution scheduled");
loadPlayerPrivilegesExecution(player_uuid);
_update_privilege_is_scheduled.set(false);
XLogger.debug("run loadMembersExecution scheduled");
loadMembersExecution(player_uuid);
_update_member_is_scheduled.set(false);
},
delay_tick);
}
}
public void loadPlayerPrivileges() {
loadPlayerPrivileges(null);
public void loadMembers() {
loadMembers(null);
}
private void loadPlayerPrivilegesExecution(UUID player_to_update) {
private void loadMembersExecution(UUID player_to_update) {
Scheduler.runTaskAsync(() -> {
long start = System.currentTimeMillis();
List<PlayerPrivilegeDTO> all_privileges;
List<MemberDTO> all_privileges;
if (player_to_update == null) {
all_privileges = PlayerPrivilegeDTO.selectAll();
player_uuid_to_privilege = new ConcurrentHashMap<>();
all_privileges = MemberDTO.selectAll();
player_uuid_to_member = new ConcurrentHashMap<>();
} else {
all_privileges = PlayerPrivilegeDTO.selectAll(player_to_update);
if (!player_uuid_to_privilege.containsKey(player_to_update)) {
player_uuid_to_privilege.put(player_to_update, new ConcurrentHashMap<>());
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_privilege.get(player_to_update).clear();
player_uuid_to_member.get(player_to_update).clear();
}
for (PlayerPrivilegeDTO privilege : all_privileges) {
for (MemberDTO privilege : all_privileges) {
UUID player_uuid = privilege.getPlayerUUID();
if (!player_uuid_to_privilege.containsKey(player_uuid)) {
player_uuid_to_privilege.put(player_uuid, new ConcurrentHashMap<>());
if (!player_uuid_to_member.containsKey(player_uuid)) {
player_uuid_to_member.put(player_uuid, new ConcurrentHashMap<>());
}
player_uuid_to_privilege.get(player_uuid).put(privilege.getDomID(), privilege);
player_uuid_to_member.get(player_uuid).put(privilege.getDomID(), privilege);
}
recheckPlayerState = true;
_last_update_privilege.set(System.currentTimeMillis());
XLogger.debug("loadPlayerPrivilegesExecution cost: %d ms for %d privileges"
_last_update_member.set(System.currentTimeMillis());
XLogger.debug("loadMembersExecution cost: %d ms for %d privileges"
, System.currentTimeMillis() - start, all_privileges.size());
});
}
public void loadGroup() {
loadGroup(null);
public void loadGroups() {
loadGroups(null);
}
public void loadGroup(Integer groupId) {
public void loadGroups(Integer groupId) {
if (_last_update_group.get() + UPDATE_INTERVAL < System.currentTimeMillis()) {
XLogger.debug("run loadGroupExecution directly");
XLogger.debug("run loadGroupsExecution directly");
loadGroupExecution(groupId);
} else {
if (_update_group_is_scheduled.get()) return;
XLogger.debug("schedule loadGroupExecution");
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 loadGroupExecution scheduled");
XLogger.debug("run loadGroupsExecution scheduled");
loadGroupExecution(groupId);
_update_group_is_scheduled.set(false);
},
@ -195,7 +195,7 @@ public class Cache {
}
recheckPlayerState = true;
_last_update_group.set(System.currentTimeMillis());
XLogger.debug("loadGroupExecution cost: %d ms", System.currentTimeMillis() - start);
XLogger.debug("loadGroupsExecution cost: %d ms", System.currentTimeMillis() - start);
});
}
@ -283,7 +283,7 @@ public class Cache {
player.setGlowing(false);
return;
}
PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion);
MemberDTO privilege = getMember(player, dominion);
if (privilege != null) {
if (privilege.getGroupId() == -1) {
player.setGlowing(privilege.getFlagValue(Flag.GLOW));
@ -320,7 +320,7 @@ public class Cache {
player.setAllowFlight(false);
return;
}
PlayerPrivilegeDTO privilege = getPlayerPrivilege(player, dominion);
MemberDTO privilege = getMember(player, dominion);
if (privilege != null) {
if (privilege.getGroupId() == -1) {
player.setAllowFlight(privilege.getFlagValue(Flag.FLY));
@ -375,14 +375,14 @@ public class Cache {
* @param dominion 领地
* @return 特权表
*/
public PlayerPrivilegeDTO getPlayerPrivilege(Player player, DominionDTO dominion) {
if (!player_uuid_to_privilege.containsKey(player.getUniqueId())) return null;
return player_uuid_to_privilege.get(player.getUniqueId()).get(dominion.getId());
public MemberDTO getMember(Player player, DominionDTO dominion) {
if (!player_uuid_to_member.containsKey(player.getUniqueId())) return null;
return player_uuid_to_member.get(player.getUniqueId()).get(dominion.getId());
}
public PlayerPrivilegeDTO getPlayerPrivilege(UUID player_uuid, DominionDTO dominion) {
if (!player_uuid_to_privilege.containsKey(player_uuid)) return null;
return player_uuid_to_privilege.get(player_uuid).get(dominion.getId());
public MemberDTO getMember(UUID player_uuid, DominionDTO dominion) {
if (!player_uuid_to_member.containsKey(player_uuid)) return null;
return player_uuid_to_member.get(player_uuid).get(dominion.getId());
}
private static boolean isInDominion(@Nullable DominionDTO dominion, Player player) {
@ -437,13 +437,13 @@ public class Cache {
private ConcurrentHashMap<Integer, DominionDTO> id_dominions;
private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree;
private ConcurrentHashMap<Integer, GroupDTO> id_groups;
private ConcurrentHashMap<UUID, ConcurrentHashMap<Integer, PlayerPrivilegeDTO>> player_uuid_to_privilege; // 玩家所有的特权
private ConcurrentHashMap<UUID, ConcurrentHashMap<Integer, MemberDTO>> player_uuid_to_member; // 玩家所有的特权
private final Map<UUID, Integer> player_current_dominion_id; // 玩家当前所在领地
private ConcurrentHashMap<Integer, List<Integer>> dominion_children;
private final AtomicLong _last_update_dominion = new AtomicLong(0);
private final AtomicBoolean _update_dominion_is_scheduled = new AtomicBoolean(false);
private final AtomicLong _last_update_privilege = new AtomicLong(0);
private final AtomicBoolean _update_privilege_is_scheduled = new AtomicBoolean(false);
private final AtomicLong _last_update_member = new AtomicLong(0);
private final AtomicBoolean _update_member_is_scheduled = new AtomicBoolean(false);
private final AtomicLong _last_update_group = new AtomicLong(0);
private final AtomicBoolean _update_group_is_scheduled = new AtomicBoolean(false);
private static final long UPDATE_INTERVAL = 1000 * 4;

View File

@ -27,7 +27,6 @@ public final class Dominion extends JavaPlugin {
new Notification(this);
new XLogger(this);
config = new ConfigManager(this);
XLogger.setDebug(config.isDebug());
new DatabaseManager(this,
DatabaseType.valueOf(config.getDbType().toUpperCase()),
config.getDbHost(),
@ -39,9 +38,6 @@ public final class Dominion extends JavaPlugin {
new Scheduler(this);
AutoClean.run();
Cache.instance = new Cache();
if (config.getEconomyEnable()) {
new VaultConnect(this);
}
Bukkit.getPluginManager().registerEvents(new PlayerEvents(), this);
Bukkit.getPluginManager().registerEvents(new EnvironmentEvents(), this);
@ -49,6 +45,8 @@ public final class Dominion extends JavaPlugin {
Objects.requireNonNull(Bukkit.getPluginCommand("dominion")).setExecutor(new Commands());
bStatsMetrics metrics = new bStatsMetrics(this, 21445);
metrics.addCustomChart(new bStatsMetrics.SimplePie("database", () -> config.getDbType()));
if (config.getCheckUpdate()) {
giteaReleaseCheck = new GiteaReleaseCheck(this,
"https://ssl.lunadeer.cn:14446",

View File

@ -36,7 +36,7 @@ public class Apis {
Notification.info(sender, " 领地的对角点坐标: x1=%d y1=%d z1=%d, x2=%d y2=%d z2=%d", x1, y1, z1, x2, y2, z2);
}
public static void autoPoints(Player player) {
public static Map<Integer, Location> autoPoints(Player player) {
Integer size = Dominion.config.getAutoCreateRadius();
Location location = player.getLocation();
Location location1 = new Location(location.getWorld(), location.getX() - size, location.getY() - size, location.getZ() - size);
@ -49,6 +49,7 @@ public class Apis {
points.put(0, location1);
points.put(1, location2);
Dominion.pointsSelect.put(player.getUniqueId(), points);
return points;
}
public static boolean notOpOrConsole(CommandSender sender) {

View File

@ -6,7 +6,8 @@ import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.Teleport;
@ -374,7 +375,7 @@ public class DominionOperate {
return;
}
PlayerPrivilegeDTO privilegeDTO = PlayerPrivilegeDTO.select(player.getUniqueId(), dominionDTO.getId());
MemberDTO privilegeDTO = MemberDTO.select(player.getUniqueId(), dominionDTO.getId());
if (!player.getUniqueId().equals(dominionDTO.getOwner())) { // 领地所有人可以传送到自己的领地
if (privilegeDTO == null) {
if (!dominionDTO.getFlagValue(Flag.TELEPORT)) {
@ -382,9 +383,17 @@ public class DominionOperate {
return;
}
} else {
if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你不被允许传送到这个领地");
return;
if (privilegeDTO.getGroupId() == -1) {
if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你不被允许传送到这个领地");
return;
}
} else {
GroupDTO groupDTO = Cache.instance.getGroup(privilegeDTO.getGroupId());
if (!groupDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你所在的权限组组不被允许传送到这个领地");
return;
}
}
}
}

View File

@ -55,8 +55,8 @@ public class Helper {
if (dominion == null) return players_name;
GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) return players_name;
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.selectByGroupId(group.getId());
for (PlayerPrivilegeDTO privilege : privileges) {
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());
@ -79,8 +79,8 @@ public class Helper {
List<String> dominions_name = new ArrayList<>();
Player player = playerOnly(sender);
if (player == null) return dominions_name;
List<PlayerPrivilegeDTO> dominions_admin = PlayerPrivilegeDTO.selectAll(player.getUniqueId());
for (PlayerPrivilegeDTO privilege : dominions_admin) {
List<MemberDTO> dominions_admin = MemberDTO.selectAll(player.getUniqueId());
for (MemberDTO privilege : dominions_admin) {
if (privilege.getAdmin()) {
DominionDTO dom = DominionDTO.select(privilege.getDomID());
if (dom == null) continue;

View File

@ -28,12 +28,12 @@ public class Operator {
});
Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在从数据库重新加载玩家权限缓存...");
Cache.instance.loadPlayerPrivileges();
Cache.instance.loadMembers();
Notification.info(sender, "玩家权限缓存已重新加载");
});
Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在从数据库重新加载权限组缓存...");
Cache.instance.loadGroup();
Cache.instance.loadGroups();
Notification.info(sender, "权限组缓存已重新加载");
});
}

View File

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

View File

@ -12,6 +12,7 @@ import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
@ -70,12 +71,12 @@ public class DominionController {
* @param name 领地名称
* @param loc1 位置1
* @param loc2 位置2
* @param parent_dominion_name 父领地名称
* @param parent_dominion_name 父领地名称(留空表示为根领地)
* @param skipEco 是否跳过经济检查
*/
public static void create(AbstractOperator operator, String name,
Location loc1, Location loc2,
String parent_dominion_name, boolean skipEco) {
@NotNull String parent_dominion_name, boolean skipEco) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建领地失败");
if (name.isEmpty()) {
operator.setResponse(FAIL.addMessage("领地名称不能为空"));
@ -109,12 +110,8 @@ public class DominionController {
loc2.getBlockX(), loc2.getBlockY(), loc2.getBlockZ())) {
return;
}
DominionDTO dominion = new DominionDTO(operator.getUniqueId(), name, loc1.getWorld().getName(),
(int) Math.min(loc1.getX(), loc2.getX()), (int) Math.min(loc1.getY(), loc2.getY()),
(int) Math.min(loc1.getZ(), loc2.getZ()), (int) Math.max(loc1.getX(), loc2.getX()),
(int) Math.max(loc1.getY(), loc2.getY()), (int) Math.max(loc1.getZ(), loc2.getZ()));
DominionDTO parent_dominion;
if (parent_dominion_name.isEmpty()) {
if (parent_dominion_name.isEmpty() || parent_dominion_name.equals("root")) {
parent_dominion = DominionDTO.select(-1);
} else {
parent_dominion = DominionDTO.select(parent_dominion_name);
@ -133,6 +130,11 @@ public class DominionController {
return;
}
}
// 创建 dominion (此步骤不会写入数据)
DominionDTO dominion = DominionDTO.create(operator.getUniqueId(), name, loc1.getWorld().getName(),
(int) Math.min(loc1.getX(), loc2.getX()), (int) Math.min(loc1.getY(), loc2.getY()),
(int) Math.min(loc1.getZ(), loc2.getZ()), (int) Math.max(loc1.getX(), loc2.getX()),
(int) Math.max(loc1.getY(), loc2.getY()), (int) Math.max(loc1.getZ(), loc2.getZ()), parent_dominion);
// 如果parent_dominion不为-1 检查是否在同一世界
if (parent_dominion.getId() != -1 && !parent_dominion.getWorld().equals(dominion.getWorld())) {
operator.setResponse(FAIL.addMessage("父领地与子领地不在同一世界。"));
@ -176,7 +178,7 @@ public class DominionController {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "已扣除 %.2f %s", price, VaultConnect.instance.currencyNamePlural()));
VaultConnect.instance.withdrawPlayer(operator.getPlayer(), price);
}
dominion = DominionDTO.insert(dominion);
dominion = DominionDTO.insert(dominion); // 写入数据
if (dominion == null) {
operator.setResponse(FAIL.addMessage("创建领地失败,数据库错误,请联系管理员"));
return;
@ -184,7 +186,6 @@ public class DominionController {
if (operator instanceof BukkitPlayerOperator) {
ParticleRender.showBoxFace(Dominion.instance, operator.getPlayer(), loc1, loc2);
}
dominion.setParentDomId(parent_dominion.getId());
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功创建领地 %s", name));
}
@ -831,7 +832,7 @@ public class DominionController {
level++;
}
if (level >= Dominion.config.getLimitDepth()) {
operator.setResponse(FAIL.addMessage("子领地嵌套深度不能超过 %s", Dominion.config.getLimitDepth()));
operator.setResponse(FAIL.addMessage("子领地嵌套深度不能超过 %d", Dominion.config.getLimitDepth()));
return true;
}
return false;

View File

@ -82,10 +82,6 @@ public class GroupController {
if (flag.equals("admin")) {
group = group.setAdmin(value);
} else {
if (group.getAdmin()) {
operator.setResponse(FAIL.addMessage("管理员拥有所有权限,无需单独设置权限"));
return;
}
Flag f = Flag.getFlag(flag);
if (f == null) {
operator.setResponse(FAIL.addMessage("未知的权限 %s", flag));
@ -155,7 +151,7 @@ public class GroupController {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在", playerName));
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员,无法直接加入权限组", playerName, domName));
return;
@ -202,7 +198,7 @@ public class GroupController {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在", playerName));
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", playerName, domName));
return;

View File

@ -28,7 +28,7 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name));
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName));
return;
@ -37,7 +37,7 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法移除一个领地管理员", dominionName));
return;
}
PlayerPrivilegeDTO.delete(player.getUuid(), dominion.getId());
MemberDTO.delete(player.getUuid(), dominion.getId());
operator.setResponse(SUCCESS);
}
@ -64,7 +64,7 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name));
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName));
return;
@ -76,10 +76,6 @@ public class MemberController {
if (flag.equals("admin")) {
privilege.setAdmin(value);
} else {
if (privilege.getAdmin()) {
operator.setResponse(FAIL.addMessage("管理员拥有所有权限,无需单独设置权限"));
return;
}
Flag f = Flag.getFlag(flag);
if (f == null) {
operator.setResponse(FAIL.addMessage("未知的领地权限 %s", flag));
@ -104,7 +100,12 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name));
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.insert(new PlayerPrivilegeDTO(player.getUuid(), dominion));
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 {
@ -126,7 +127,7 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", playerName));
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(player.getUuid(), dominion.getId());
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", playerName, dominionName));
return;

View File

@ -30,12 +30,11 @@ public class CreateDominion {
@Override
public void handleData(String input) {
XLogger.debug("createDominionCB.run: %s", input);
autoPoints(sender);
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
Map<Integer, Location> points = Dominion.pointsSelect.get(sender.getUniqueId());
if (points == null || points.get(0) == null || points.get(1) == null) {
Notification.error(sender, "自动选点失败");
return;
points = autoPoints(sender);
}
operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)) {

View File

@ -191,6 +191,11 @@ public class DominionDTO {
this(null, owner, name, world, x1, y1, z1, x2, y2, z2, -1);
}
public static DominionDTO create(UUID owner, String name, String world,
Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2, DominionDTO parent) {
return new DominionDTO(null, owner, name, world, x1, y1, z1, x2, y2, z2, parent == null ? -1 : parent.getId());
}
private final Field id = new Field("id", FieldType.INT);
private final Field owner = new Field("owner", FieldType.STRING);
private final Field name = new Field("name", FieldType.STRING);
@ -329,11 +334,6 @@ public class DominionDTO {
return (Integer) parentDomId.value;
}
public DominionDTO setParentDomId(Integer parentDomId) {
this.parentDomId.value = parentDomId;
return doUpdate(new UpdateRow().field(this.parentDomId));
}
public String getJoinMessage() {
return (String) joinMessage.value;
}

View File

@ -28,6 +28,7 @@ public enum Flag {
CREEPER_EXPLODE("creeper_explode", "实体爆炸", "包含:苦力怕/凋零头颅/水晶爆炸", false, true, true),
COMPARER("comparer", "比较器交互", "是否可以修改比较器状态", false, false, true),
DOOR("door", "门交互", "是否可以使用各种材质的门(包括活板门)", false, false, true),
DRAGON_EGG("dragon_egg", "触碰龙蛋", "是否可以触碰龙蛋", false, false, true),
DYE("dye", "染色", "是否可以使用染料(对羊、狗项圈、猫项圈)染色", false, false, true),
EDIT_SIGN("edit_sign", "编辑告示牌", "是否可以编辑告示牌", false, false, true),
EGG("egg", "扔鸡蛋", "是否可以扔鸡蛋", false, false, true),

View File

@ -74,7 +74,7 @@ public class GroupDTO {
try (ResultSet rs = insertRow.execute()) {
List<GroupDTO> groups = getDTOFromRS(rs);
if (groups.size() == 0) return null;
Cache.instance.loadGroup(groups.get(0).getId());
Cache.instance.loadGroups(groups.get(0).getId());
return groups.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("创建权限组失败: ", e, "");
@ -89,9 +89,9 @@ public class GroupDTO {
public static void delete(Integer id) {
String sql = "DELETE FROM dominion_group WHERE id = ?;";
DatabaseManager.instance.query(sql, id);
Cache.instance.loadGroup(id);
List<PlayerPrivilegeDTO> players = PlayerPrivilegeDTO.selectByGroupId(id);
for (PlayerPrivilegeDTO player : players) {
Cache.instance.loadGroups(id);
List<MemberDTO> players = MemberDTO.selectByGroupId(id);
for (MemberDTO player : players) {
player.setGroupId(-1);
}
}
@ -168,7 +168,7 @@ public class GroupDTO {
try (ResultSet rs = updateRow.execute()) {
List<GroupDTO> groups = getDTOFromRS(rs);
if (groups.size() == 0) return null;
Cache.instance.loadGroup((Integer) id.value);
Cache.instance.loadGroups((Integer) id.value);
return groups.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("更新权限组失败: ", e, "");

View File

@ -10,10 +10,10 @@ import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import java.sql.ResultSet;
import java.util.*;
public class PlayerPrivilegeDTO {
public class MemberDTO {
private static List<PlayerPrivilegeDTO> query(String sql, Object... params) {
List<PlayerPrivilegeDTO> players = new ArrayList<>();
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) {
@ -22,8 +22,8 @@ public class PlayerPrivilegeDTO {
return players;
}
private static List<PlayerPrivilegeDTO> getDTOFromRS(ResultSet rs) {
List<PlayerPrivilegeDTO> players = new ArrayList<>();
private static List<MemberDTO> getDTOFromRS(ResultSet rs) {
List<MemberDTO> players = new ArrayList<>();
if (rs == null) return players;
try {
while (rs.next()) {
@ -31,7 +31,7 @@ public class PlayerPrivilegeDTO {
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName()));
}
PlayerPrivilegeDTO player = new PlayerPrivilegeDTO(
MemberDTO player = new MemberDTO(
rs.getInt("id"),
UUID.fromString(rs.getString("player_uuid")),
rs.getBoolean("admin"),
@ -47,14 +47,14 @@ public class PlayerPrivilegeDTO {
return players;
}
private PlayerPrivilegeDTO doUpdate(UpdateRow updateRow) {
private MemberDTO doUpdate(UpdateRow updateRow) {
updateRow.returningAll(id)
.table("player_privilege")
.table("dominion_member")
.where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) {
List<PlayerPrivilegeDTO> players = getDTOFromRS(rs);
List<MemberDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
Cache.instance.loadPlayerPrivileges(getPlayerUUID());
Cache.instance.loadMembers(getPlayerUUID());
return players.get(0);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, "");
@ -62,9 +62,9 @@ public class PlayerPrivilegeDTO {
}
}
public static PlayerPrivilegeDTO insert(PlayerPrivilegeDTO player) {
public static MemberDTO insert(MemberDTO player) {
InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null))
.table("player_privilege")
.table("dominion_member")
.field(player.playerUUID)
.field(player.admin)
.field(player.domID);
@ -72,8 +72,8 @@ public class PlayerPrivilegeDTO {
insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f)));
}
try (ResultSet rs = insertRow.execute()) {
Cache.instance.loadPlayerPrivileges(player.getPlayerUUID());
List<PlayerPrivilegeDTO> players = getDTOFromRS(rs);
Cache.instance.loadMembers(player.getPlayerUUID());
List<MemberDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null;
return players.get(0);
} catch (Exception e) {
@ -82,39 +82,44 @@ public class PlayerPrivilegeDTO {
}
}
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);
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<PlayerPrivilegeDTO> select(Integer dom_id) {
String sql = "SELECT * FROM player_privilege WHERE dom_id = ?;";
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 player_privilege WHERE player_uuid = ? AND dom_id = ?;";
String sql = "DELETE FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;";
query(sql, player.toString(), domID);
Cache.instance.loadPlayerPrivileges(player);
Cache.instance.loadMembers(player);
}
public static List<PlayerPrivilegeDTO> selectAll() {
String sql = "SELECT * FROM player_privilege;";
public static List<MemberDTO> selectAll() {
String sql = "SELECT * FROM dominion_member;";
return query(sql);
}
public static List<PlayerPrivilegeDTO> selectAll(UUID player) {
String sql = "SELECT * FROM player_privilege WHERE player_uuid = ?;";
public static List<MemberDTO> selectAll(UUID player) {
String sql = "SELECT * FROM dominion_member WHERE player_uuid = ?;";
return query(sql, player.toString());
}
public static List<PlayerPrivilegeDTO> selectByGroupId(Integer groupId) {
String sql = "SELECT * FROM player_privilege WHERE group_id = ?;";
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);
@ -148,26 +153,26 @@ public class PlayerPrivilegeDTO {
return flags.get(flag);
}
public PlayerPrivilegeDTO setFlagValue(Flag flag, Boolean value) {
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 PlayerPrivilegeDTO setAdmin(Boolean admin) {
public MemberDTO setAdmin(Boolean admin) {
this.admin.value = admin;
UpdateRow updateRow = new UpdateRow().field(this.admin);
return doUpdate(updateRow);
}
public PlayerPrivilegeDTO setGroupId(Integer groupId) {
public MemberDTO setGroupId(Integer groupId) {
this.groupId.value = groupId;
UpdateRow updateRow = new UpdateRow().field(this.groupId);
return doUpdate(updateRow);
}
public PlayerPrivilegeDTO applyTemplate(PrivilegeTemplateDTO template) {
public MemberDTO applyTemplate(PrivilegeTemplateDTO template) {
this.admin.value = template.getAdmin();
UpdateRow updateRow = new UpdateRow().field(admin);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
@ -177,7 +182,7 @@ public class PlayerPrivilegeDTO {
return doUpdate(updateRow);
}
private PlayerPrivilegeDTO(Integer id, UUID playerUUID, Boolean admin, Integer domID, Map<Flag, Boolean> flags, Integer groupId) {
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;
@ -186,7 +191,7 @@ public class PlayerPrivilegeDTO {
this.flags.putAll(flags);
}
public PlayerPrivilegeDTO(UUID playerUUID, DominionDTO dom) {
public MemberDTO(UUID playerUUID, DominionDTO dom) {
this.id.value = null;
this.playerUUID.value = playerUUID.toString();
this.admin.value = false;

View File

@ -5,7 +5,7 @@ import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
@ -17,7 +17,7 @@ import org.bukkit.event.Cancellable;
import org.bukkit.inventory.Inventory;
public class Apis {
public static boolean canByPass(Player player, DominionDTO dom, PlayerPrivilegeDTO prev) {
public static boolean canByPass(Player player, DominionDTO dom, MemberDTO prev) {
if (player.isOp() && Dominion.config.getLimitOpBypass()) {
return true;
}
@ -48,7 +48,7 @@ public class Apis {
if (dom == null) {
return true;
}
PlayerPrivilegeDTO prev = Cache.instance.getPlayerPrivilege(player, dom);
MemberDTO prev = Cache.instance.getMember(player, dom);
if (canByPass(player, dom, prev)) {
return true;
}

View File

@ -103,7 +103,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // bed
public void onBedUse(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Player bukkitPlayer = event.getPlayer();
@ -165,7 +165,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // button
public void onButton(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Player player = event.getPlayer();
@ -182,7 +182,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // cake
public void eatCake(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Block block = event.getClickedBlock();
@ -280,7 +280,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // comparer
public void comparerChange(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Block block = event.getClickedBlock();
@ -298,7 +298,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // door
public void doorUse(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Block block = event.getClickedBlock();
@ -313,6 +313,20 @@ public class PlayerEvents implements Listener {
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
public void dyeEvent(PlayerInteractEntityEvent event) {
Player player = event.getPlayer();
@ -326,7 +340,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // edit sign
public void onSignOpen(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Player player = event.getPlayer();
@ -430,7 +444,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // honey
public void honeyInteractive(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Block block = event.getClickedBlock();
@ -488,7 +502,7 @@ public class PlayerEvents implements Listener {
@EventHandler(priority = EventPriority.HIGHEST) // lever
public void onLever(PlayerInteractEvent event) {
if (!event.getAction().isRightClick()) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Block block = event.getClickedBlock();

View File

@ -2,6 +2,7 @@ package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.VaultConnect;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration;
@ -82,6 +83,9 @@ public class ConfigManager {
_economy_price = (float) _file.getDouble("Economy.Price", 10.0);
_economy_only_xz = _file.getBoolean("Economy.OnlyXZ", false);
_economy_refund = (float) _file.getDouble("Economy.Refund", 0.85);
if (getEconomyEnable()) {
new VaultConnect(this._plugin);
}
_fly_permission_nodes = _file.getStringList("FlyPermissionNodes");
_residence_migration = _file.getBoolean("ResidenceMigration", false);
saveAll(); // 回写文件 防止文件中的数据不完整

View File

@ -1,13 +1,13 @@
package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.FieldType;
import cn.lunadeer.minecraftpluginutils.databse.TableColumn;
import cn.lunadeer.minecraftpluginutils.databse.*;
import cn.lunadeer.minecraftpluginutils.databse.syntax.AddColumn;
import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import java.sql.ResultSet;
public class DatabaseTables {
public static void migrate() {
// player name
@ -58,23 +58,35 @@ public class DatabaseTables {
.foreignKey(dominion_parent_dom_id_fk);
dominion.execute();
for (Flag flag : Flag.getAllDominionFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("dominion").ifNotExists().execute();
}
// player privilege
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();
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);
@ -116,21 +128,11 @@ public class DatabaseTables {
.field(server_dom_leave_message_field);
insert_server_dom.execute();
for (Flag flag : Flag.getAllDominionFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("dominion").ifNotExists().execute();
}
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();
}
// 1.18.0
// 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
// 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, "'未命名'");
@ -152,31 +154,82 @@ public class DatabaseTables {
new AddColumn(column).table("privilege_template").ifNotExists().execute();
}
// 1.31.6
// 1.31.6 dominion add blue-map tile color
TableColumn dominion_color = new TableColumn("color", FieldType.STRING, false, false, true, false, "'#00BFFF'");
new AddColumn(dominion_color).table("dominion").ifNotExists().execute();
// 1.34.0
TableColumn player_privilege_group_id = new TableColumn("group_id", FieldType.INT, false, false, true, false, -1);
new AddColumn(player_privilege_group_id).table("player_privilege").ifNotExists().execute();
// 1.34.0 add dominion_group
if (!Common.IsTableExist("dominion_member")) {
TableColumn player_privilege_group_id = new TableColumn("group_id", FieldType.INT, false, false, true, false, -1);
new AddColumn(player_privilege_group_id).table("player_privilege").ifNotExists().execute();
}
TableColumn group_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn group_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1);
TableColumn group_name = new TableColumn("name", FieldType.STRING, false, false, true, false, "'未命名'");
TableColumn group_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false);
CreateTable.ForeignKey group_dom_id_fk = new CreateTable.ForeignKey(group_dom_id, "dominion", dominion_id, true);
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(group_id)
.field(group_dom_id)
.field(group_name)
.field(group_admin)
.field(dominion_group_id)
.field(dominion_group_dom_id)
.field(dominion_group_name)
.field(dominion_group_admin)
.foreignKey(group_dom_id_fk)
.unique(group_dom_id, group_name);
.unique(dominion_group_dom_id, dominion_group_name);
group.execute();
for (Flag flag : Flag.getAllPrivilegeFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("dominion_group").ifNotExists().execute();
}
// 1.35.0 migrate player_privilege -> dominion_member
TableColumn dominion_member_id = new TableColumn("id", FieldType.INT, true, true, true, true, 0);
TableColumn dominion_member_player_uuid = new TableColumn("player_uuid", FieldType.STRING, false, false, true, false, "''");
TableColumn dominion_member_dom_id = new TableColumn("dom_id", FieldType.INT, false, false, true, false, -1);
TableColumn dominion_member_admin = new TableColumn("admin", FieldType.BOOLEAN, false, false, true, false, false);
TableColumn dominion_member_group_id = new TableColumn("group_id", FieldType.INT, false, false, true, false, -1);
CreateTable.ForeignKey dominion_member_player_uuid_fk = new CreateTable.ForeignKey(dominion_member_player_uuid, "player_name", player_name_uuid, true);
CreateTable.ForeignKey dominion_member_dom_id_fk = new CreateTable.ForeignKey(dominion_member_dom_id, "dominion", dominion_id, true);
CreateTable dominion_member = new CreateTable().ifNotExists();
dominion_member.table("dominion_member")
.field(dominion_member_id)
.field(dominion_member_player_uuid)
.field(dominion_member_dom_id)
.field(dominion_member_admin)
.field(dominion_member_group_id)
.foreignKey(dominion_member_player_uuid_fk)
.foreignKey(dominion_member_dom_id_fk)
.unique(dominion_member_player_uuid, dominion_member_dom_id);
dominion_member.execute();
for (Flag flag : Flag.getAllPrivilegeFlags()) {
TableColumn column = new TableColumn(flag.getFlagName(), FieldType.BOOLEAN, false, false, true, false, flag.getDefaultValue());
new AddColumn(column).table("dominion_member").ifNotExists().execute();
}
if (Common.IsTableExist("player_privilege")) {
// migrate from player_privilege to dominion_member
String sql = "SELECT * FROM player_privilege;";
try (ResultSet rs = DatabaseManager.instance.query(sql)) {
while (rs.next()) {
String player_uuid = rs.getString("player_uuid");
int dom_id = rs.getInt("dom_id");
boolean admin = rs.getBoolean("admin");
int group_id = rs.getInt("group_id");
InsertRow insert = new InsertRow().table("dominion_member")
.field(new Field("player_uuid", player_uuid))
.field(new Field("dom_id", dom_id))
.field(new Field("group_id", group_id))
.field(new Field("admin", admin));
for (Flag flag : Flag.getAllPrivilegeFlags()) {
insert.field(new Field(flag.getFlagName(), rs.getBoolean(flag.getFlagName())));
}
insert.execute();
}
sql = "DROP TABLE player_privilege;";
DatabaseManager.instance.query(sql);
} catch (Exception e) {
DatabaseManager.handleDatabaseError("迁移 player_privilege 到 dominion_member 失败", e, sql);
}
}
}
}

View File

@ -2,7 +2,7 @@ package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -45,7 +45,7 @@ public class Apis {
public static boolean noAuthToManage(Player player, DominionDTO dominion) {
if (player.isOp()) return false;
if (!dominion.getOwner().equals(player.getUniqueId())) {
PlayerPrivilegeDTO privileges = PlayerPrivilegeDTO.select(player.getUniqueId(), dominion.getId());
MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId());
if (privileges == null || !privileges.getAdmin()) {
Notification.error(player, "你不是领地 %s 的拥有者或管理员,无权访问此页面", dominion.getName());
return true;

View File

@ -2,8 +2,8 @@ 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.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.dominion.tuis.Apis;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
@ -72,9 +72,9 @@ public class GroupList {
.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<PlayerPrivilegeDTO> players = PlayerPrivilegeDTO.selectByGroupId(group.getId());
List<MemberDTO> players = MemberDTO.selectByGroupId(group.getId());
XLogger.debug("players: " + players.size());
for (PlayerPrivilegeDTO playerPrivilege : players) {
for (MemberDTO playerPrivilege : players) {
PlayerDTO p = PlayerDTO.select(playerPrivilege.getPlayerUUID());
if (p == null) continue;
Button remove = Button.createRed("-")

View File

@ -2,8 +2,8 @@ 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.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -43,8 +43,8 @@ public class SelectMember {
Line sub = Line.create().append("选择成员添加到权限组 " + group.getName())
.append(Button.create("返回").setExecuteCommand("/dominion group list " + dominion.getName() + " " + backPage).build());
view.subtitle(sub);
List<PlayerPrivilegeDTO> members = PlayerPrivilegeDTO.selectByGroupId(-1);
for (PlayerPrivilegeDTO member : members) {
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()

View File

@ -45,7 +45,7 @@ public class MemberList {
int page = getPage(args, 3);
ListView view = ListView.create(10, "/dominion member list " + dominion.getName());
if (noAuthToManage(player, dominion)) return;
List<PlayerPrivilegeDTO> privileges = PlayerPrivilegeDTO.select(dominion.getId());
List<MemberDTO> privileges = MemberDTO.select(dominion.getId());
view.title("领地 " + dominion.getName() + " 成员列表");
view.navigator(
Line.create()
@ -56,7 +56,7 @@ public class MemberList {
);
view.add(Line.create().append(Button.create("添加成员")
.setExecuteCommand(CommandParser("/dominion member select_player %s", dominion.getName())).build()));
for (PlayerPrivilegeDTO privilege : privileges) {
for (MemberDTO privilege : privileges) {
PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID());
if (p_player == null) continue;
GroupDTO group = Cache.instance.getGroup(privilege.getGroupId());

View File

@ -2,8 +2,8 @@ package cn.lunadeer.dominion.tuis.dominion.manage.member;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.dtos.PlayerPrivilegeDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -46,7 +46,7 @@ public class MemberSetting {
Notification.error(sender, "玩家 %s 不存在", playerName);
return;
}
PlayerPrivilegeDTO privilege = PlayerPrivilegeDTO.select(playerDTO.getUuid(), dominion.getId());
MemberDTO privilege = MemberDTO.select(playerDTO.getUuid(), dominion.getId());
if (privilege == null) {
Notification.warn(sender, "玩家 %s 不是领地 %s 的成员", playerName, dominion.getName());
return;