Compare commits

...

21 Commits

Author SHA1 Message Date
a4c61f183c 将项目迁移到GitHub https://github.com/DeerGiteaMirror/Dominion 2024-08-25 11:13:02 +08:00
eeb0f1adc7 实现了采用world uid存储世界而不是name(如果使用此版本出现问题请不要回退版本!请立即和作者取得联系!) 2024-08-24 20:53:07 +08:00
87fc89407d 完成了DTO的修改 2024-08-24 19:50:12 +08:00
85b9becfab 更新版本 2024-08-24 19:22:41 +08:00
2e589287b5 Merge remote-tracking branch 'origin/master' 2024-08-24 19:20:12 +08:00
ba495d9bd7 修复了部分领地tp点报错未捕获异常问题 2024-08-24 19:15:07 +08:00
bbb97b0859 修复了漏斗可以偷领地内箱子的漏洞
修复了活塞可以跨领地推东西导致潜在破坏的漏洞
2024-08-23 19:42:19 +08:00
150939dc45 修复了领地管理员权限组可能无法管理领地玩家的问题 2024-08-22 10:44:49 +08:00
0cb2ac81d4 修复领地系统权限组配置被覆写问题
完成了领地系统权限组功能开发
(此功能详见 > https://ssl.lunadeer.cn:14448/doc/82/)
2024-08-21 10:29:31 +08:00
a39030e258 更新 README.md 2024-08-20 14:06:47 +08:00
fd853661e3 实现了领地系统多权限组(多种圈地限制)功能 2024-08-19 22:17:10 +08:00
230e26037f 新增领地系统权限组 2024-08-19 18:47:35 +08:00
9660968125 完善配置文件 2024-08-19 14:24:30 +08:00
765fef5c66 优化代码结构,修复了某些指令输入错误时缺少提示的问题 2024-08-19 14:14:08 +08:00
6978e4f05b 更新README 2024-08-19 10:32:25 +08:00
3ec3c63724 更新README 2024-08-19 10:31:23 +08:00
170dd8cbe7 修复了展示框可被小白破坏的问题 2024-08-14 17:08:30 +08:00
a321e39fe5 数据库新增自动重连机制,允许修改配置文件后直接重连不必再重启服务器 2024-08-14 10:04:20 +08:00
0e638e00b2 引入计时器统计性能 2024-08-13 14:49:56 +08:00
3fe0ebfe3c 从菜单中暂时移除帮助菜单 2024-08-12 21:22:28 +08:00
16d2ae73d8 修复领地所有者可以被添加为领地成员的漏洞 2024-08-12 19:38:39 +08:00
69 changed files with 987 additions and 451 deletions

@ -16,16 +16,12 @@ jobs:
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'temurin'
distribution: 'zulu'
cache: gradle
- name: "Build with Gradle"
run: ./gradlew buildPlugin
- name: "Copy jar to staging"
run: mkdir staging && cp build/libs/*.jar staging/
# 设置 jobs Maven pom 版本环境变量
- name: Set Release version env variable
run: |
echo "RELEASE_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)" >> $GITHUB_ENV
- name: "Build & test"
run: |
echo "done!"
@ -34,6 +30,5 @@ jobs:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "latest"
prerelease: false
title: "Release ${{ env.RELEASE_VERSION }}"
files: |
staging/*.jar

@ -2,7 +2,7 @@
<img src="https://ssl.lunadeer.cn:14437/i/2024/03/28/6604f0cec0f0e.png" alt="" width="70%">
### [开源地址](https://ssl.lunadeer.cn:14446/zhangyuheng/Dominion) | [文档地址](https://ssl.lunadeer.cn:14448/doc/23/)
### [开源地址](https://github.com/DeerGiteaMirror/Dominion) | [文档地址](https://ssl.lunadeer.cn:14448/doc/23/)
### [下载页面](https://ssl.lunadeer.cn:14446/zhangyuheng/Dominion/releases)
@ -38,21 +38,25 @@
- 领地区域可视化;
- 管理员可在游戏内使用TUI配置领地系统
- 支持[从 Residence 迁移](https://ssl.lunadeer.cn:14448/doc/73/)领地数据1.33.7+
- 超高性能一个坐标在10127个领地内的搜索平均耗时不超过0.2ms仅占用1tick的不到0.4%时间)
<div align="center">
创建领地
### 创建领地
<img src="https://ssl.lunadeer.cn:14437/i/2024/05/10/663debf78eca4.gif" alt="" width="60%">
权限管理
### 权限管理
<img src="https://ssl.lunadeer.cn:14437/i/2024/05/10/663debe052786.gif" alt="" width="60%">
配置
### 配置
<img src="https://ssl.lunadeer.cn:14437/i/2024/05/10/663debec11dad.gif" alt="" width="60%">
### 高性能
<img src="https://ssl.lunadeer.cn:14437/i/2024/08/13/66bad56cc9fac.png" alt="" width="60%">
</div>
@ -60,6 +64,8 @@
- 1.20.1+ (Bukkit、Spigot、Paper、Folia)
> 需要使用 Java21 运行你的服务端,如果你还在使用 Java17 可以放心替换为 Java21理论上 1.20.1+ 版本的服务端核心可以直接升级到 Java21 启动。
## TODO
- WebUI

@ -4,7 +4,7 @@ plugins {
}
group = "cn.lunadeer"
version = "2.1.16-beta"
version = "2.3.0-beta"
java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21))

@ -4,11 +4,13 @@ import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.utils.MapRender;
import cn.lunadeer.dominion.utils.Particle;
import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.minecraftpluginutils.AutoTimer;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -213,51 +215,53 @@ public class Cache {
* @return 玩家当前所在领地
*/
public DominionDTO getPlayerCurrentDominion(Player player) {
Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId());
DominionDTO last_dominion = null;
if (last_in_dom_id != null) {
last_dominion = id_dominions.get(last_in_dom_id);
}
if (isInDominion(last_dominion, player.getLocation())) {
if (dominion_children.get(last_in_dom_id) == null || dominion_children.get(last_in_dom_id).size() == 0) {
// 如果玩家仍在领地内且领地没有子领地则直接返回
if (recheckPlayerState) {
lightOrNot(player, last_dominion);
flyOrNot(player, last_dominion);
recheckPlayerState = false;
try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) {
Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId());
DominionDTO last_dominion = null;
if (last_in_dom_id != null) {
last_dominion = id_dominions.get(last_in_dom_id);
}
if (isInDominion(last_dominion, player.getLocation())) {
if (dominion_children.get(last_in_dom_id) == null || dominion_children.get(last_in_dom_id).isEmpty()) {
// 如果玩家仍在领地内且领地没有子领地则直接返回
if (recheckPlayerState) {
lightOrNot(player, last_dominion);
flyOrNot(player, last_dominion);
recheckPlayerState = false;
}
return last_dominion;
}
}
DominionDTO current_dominion = dominion_trees.getLocInDominionDTO(player.getLocation());
int last_dom_id = last_dominion == null ? -1 : last_dominion.getId();
int current_dom_id = current_dominion == null ? -1 : current_dominion.getId();
if (last_dom_id == current_dom_id) {
return last_dominion;
}
}
DominionDTO current_dominion = dominion_trees.getLocInDominionDTO(player.getLocation());
int last_dom_id = last_dominion == null ? -1 : last_dominion.getId();
int current_dom_id = current_dominion == null ? -1 : current_dominion.getId();
if (last_dom_id == current_dom_id) {
return last_dominion;
}
if (last_dom_id != -1) {
String msg = last_dominion.getLeaveMessage();
msg = msg.replace("${DOM_NAME}", last_dominion.getName());
Notification.actionBar(player, msg);
}
if (current_dom_id != -1) {
String msg = current_dominion.getJoinMessage();
msg = msg.replace("${DOM_NAME}", current_dominion.getName());
Notification.actionBar(player, msg);
}
if (last_dom_id != -1) {
String msg = last_dominion.getLeaveMessage();
msg = msg.replace("${DOM_NAME}", last_dominion.getName());
Notification.actionBar(player, msg);
}
if (current_dom_id != -1) {
String msg = current_dominion.getJoinMessage();
msg = msg.replace("${DOM_NAME}", current_dominion.getName());
Notification.actionBar(player, msg);
}
lightOrNot(player, current_dominion); // 发光检查
flyOrNot(player, current_dominion); // 飞行检查
if (current_dominion == null) {
player_current_dominion_id.put(player.getUniqueId(), null);
return null;
lightOrNot(player, current_dominion); // 发光检查
flyOrNot(player, current_dominion); // 飞行检查
if (current_dominion == null) {
player_current_dominion_id.put(player.getUniqueId(), null);
return null;
}
player_current_dominion_id.put(player.getUniqueId(), current_dominion.getId());
// show border
if (current_dominion.getFlagValue(Flag.SHOW_BORDER)) {
Particle.showBorder(player, current_dominion);
}
return current_dominion;
}
player_current_dominion_id.put(player.getUniqueId(), current_dominion.getId());
// show border
if (current_dominion.getFlagValue(Flag.SHOW_BORDER)) {
Particle.showBorder(player, current_dominion);
}
return current_dominion;
}
/**
@ -460,25 +464,31 @@ public class Cache {
B | A
*/
private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree_sector_a; // x >= 0, z >= 0
private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree_sector_b; // x <= 0, z >= 0
private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree_sector_c; // x >= 0, z <= 0
private ConcurrentHashMap<String, List<DominionNode>> world_dominion_tree_sector_d; // x <= 0, z <= 0
private ConcurrentHashMap<UUID, List<DominionNode>> world_dominion_tree_sector_a; // x >= 0, z >= 0
private ConcurrentHashMap<UUID, List<DominionNode>> world_dominion_tree_sector_b; // x <= 0, z >= 0
private ConcurrentHashMap<UUID, List<DominionNode>> world_dominion_tree_sector_c; // x >= 0, z <= 0
private ConcurrentHashMap<UUID, List<DominionNode>> world_dominion_tree_sector_d; // x <= 0, z <= 0
public DominionDTO getLocInDominionDTO(@NotNull Location loc) {
List<DominionNode> nodes = getNodes(loc);
if (nodes == null) return null;
if (nodes.isEmpty()) return null;
DominionNode dominionNode = getLocInDominionNode(nodes, loc);
return dominionNode == null ? null : dominionNode.getDominion();
try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) {
List<DominionNode> nodes = getNodes(loc);
if (nodes == null) return null;
if (nodes.isEmpty()) return null;
DominionNode dominionNode = getLocInDominionNode(nodes, loc);
return dominionNode == null ? null : dominionNode.getDominion();
}
}
public List<DominionNode> getNodes(Location loc) {
return getNodes(loc.getWorld().getName(), loc.getBlockX(), loc.getBlockZ());
public List<DominionNode> getNodes(@NotNull Location loc) {
return getNodes(loc.getWorld().getUID(), loc.getBlockX(), loc.getBlockZ());
}
public List<DominionNode> getNodes(String world, int x, int z) {
public List<DominionNode> getNodes(World world, int x, int z) {
return getNodes(world.getUID(), x, z);
}
public List<DominionNode> getNodes(UUID world, int x, int z) {
if (x >= 0 && z >= 0) {
return world_dominion_tree_sector_a.get(world);
}
@ -502,64 +512,64 @@ public class Cache {
world_dominion_tree_sector_c = new ConcurrentHashMap<>();
world_dominion_tree_sector_d = new ConcurrentHashMap<>();
Map<String, List<DominionDTO>> world_dominions_sector_a = new HashMap<>();
Map<String, List<DominionDTO>> world_dominions_sector_b = new HashMap<>();
Map<String, List<DominionDTO>> world_dominions_sector_c = new HashMap<>();
Map<String, List<DominionDTO>> world_dominions_sector_d = new HashMap<>();
Map<UUID, List<DominionDTO>> world_dominions_sector_a = new HashMap<>();
Map<UUID, List<DominionDTO>> world_dominions_sector_b = new HashMap<>();
Map<UUID, List<DominionDTO>> world_dominions_sector_c = new HashMap<>();
Map<UUID, List<DominionDTO>> world_dominions_sector_d = new HashMap<>();
for (DominionDTO d : dominions) {
// 对每个世界的领地进行四个象限的划分
if (!world_dominions_sector_a.containsKey(d.getWorld()) ||
!world_dominions_sector_b.containsKey(d.getWorld()) ||
!world_dominions_sector_c.containsKey(d.getWorld()) ||
!world_dominions_sector_d.containsKey(d.getWorld())) {
world_dominions_sector_a.put(d.getWorld(), new ArrayList<>());
world_dominions_sector_b.put(d.getWorld(), new ArrayList<>());
world_dominions_sector_c.put(d.getWorld(), new ArrayList<>());
world_dominions_sector_d.put(d.getWorld(), new ArrayList<>());
if (!world_dominions_sector_a.containsKey(d.getWorldUid()) ||
!world_dominions_sector_b.containsKey(d.getWorldUid()) ||
!world_dominions_sector_c.containsKey(d.getWorldUid()) ||
!world_dominions_sector_d.containsKey(d.getWorldUid())) {
world_dominions_sector_a.put(d.getWorldUid(), new ArrayList<>());
world_dominions_sector_b.put(d.getWorldUid(), new ArrayList<>());
world_dominions_sector_c.put(d.getWorldUid(), new ArrayList<>());
world_dominions_sector_d.put(d.getWorldUid(), new ArrayList<>());
}
if (d.getX1() >= 0 && d.getZ1() >= 0) {
world_dominions_sector_a.get(d.getWorld()).add(d);
world_dominions_sector_a.get(d.getWorldUid()).add(d);
} else if (d.getX1() <= 0 && d.getZ1() >= 0) {
if (d.getX2() >= 0) {
world_dominions_sector_a.get(d.getWorld()).add(d);
world_dominions_sector_b.get(d.getWorld()).add(d);
world_dominions_sector_a.get(d.getWorldUid()).add(d);
world_dominions_sector_b.get(d.getWorldUid()).add(d);
} else {
world_dominions_sector_b.get(d.getWorld()).add(d);
world_dominions_sector_b.get(d.getWorldUid()).add(d);
}
} else if (d.getX1() >= 0 && d.getZ1() <= 0) {
if (d.getZ2() >= 0) {
world_dominions_sector_a.get(d.getWorld()).add(d);
world_dominions_sector_c.get(d.getWorld()).add(d);
world_dominions_sector_a.get(d.getWorldUid()).add(d);
world_dominions_sector_c.get(d.getWorldUid()).add(d);
} else {
world_dominions_sector_c.get(d.getWorld()).add(d);
world_dominions_sector_c.get(d.getWorldUid()).add(d);
}
} else {
if (d.getX2() >= 0 && d.getZ2() >= 0) {
world_dominions_sector_a.get(d.getWorld()).add(d);
world_dominions_sector_b.get(d.getWorld()).add(d);
world_dominions_sector_c.get(d.getWorld()).add(d);
world_dominions_sector_d.get(d.getWorld()).add(d);
world_dominions_sector_a.get(d.getWorldUid()).add(d);
world_dominions_sector_b.get(d.getWorldUid()).add(d);
world_dominions_sector_c.get(d.getWorldUid()).add(d);
world_dominions_sector_d.get(d.getWorldUid()).add(d);
} else if (d.getX2() >= 0 && d.getZ2() <= 0) {
world_dominions_sector_c.get(d.getWorld()).add(d);
world_dominions_sector_d.get(d.getWorld()).add(d);
world_dominions_sector_c.get(d.getWorldUid()).add(d);
world_dominions_sector_d.get(d.getWorldUid()).add(d);
} else if (d.getZ2() >= 0 && d.getX2() <= 0) {
world_dominions_sector_b.get(d.getWorld()).add(d);
world_dominions_sector_d.get(d.getWorld()).add(d);
world_dominions_sector_b.get(d.getWorldUid()).add(d);
world_dominions_sector_d.get(d.getWorldUid()).add(d);
} else {
world_dominions_sector_d.get(d.getWorld()).add(d);
world_dominions_sector_d.get(d.getWorldUid()).add(d);
}
}
}
for (Map.Entry<String, List<DominionDTO>> entry : world_dominions_sector_a.entrySet()) {
for (Map.Entry<UUID, List<DominionDTO>> entry : world_dominions_sector_a.entrySet()) {
world_dominion_tree_sector_a.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue()));
}
for (Map.Entry<String, List<DominionDTO>> entry : world_dominions_sector_b.entrySet()) {
for (Map.Entry<UUID, List<DominionDTO>> entry : world_dominions_sector_b.entrySet()) {
world_dominion_tree_sector_b.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue()));
}
for (Map.Entry<String, List<DominionDTO>> entry : world_dominions_sector_c.entrySet()) {
for (Map.Entry<UUID, List<DominionDTO>> entry : world_dominions_sector_c.entrySet()) {
world_dominion_tree_sector_c.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue()));
}
for (Map.Entry<String, List<DominionDTO>> entry : world_dominions_sector_d.entrySet()) {
for (Map.Entry<UUID, List<DominionDTO>> entry : world_dominions_sector_d.entrySet()) {
world_dominion_tree_sector_d.put(entry.getKey(), DominionNode.BuildNodeTree(-1, entry.getValue()));
}
}

@ -10,6 +10,7 @@ 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 cn.lunadeer.dominion.utils.TuiUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
@ -51,7 +52,7 @@ public class Commands implements TabExecutor {
DominionList.show(sender, args);
break;
case "help":
cn.lunadeer.dominion.tuis.Apis.printHelp(sender, args);
TuiUtils.printHelp(sender, args);
break;
case "info":
SizeInfo.show(sender, args);

@ -1,6 +1,5 @@
package cn.lunadeer.dominion;
import cn.lunadeer.dominion.events.RegisterEvents;
import cn.lunadeer.dominion.managers.ConfigManager;
import cn.lunadeer.dominion.managers.DatabaseTables;
import cn.lunadeer.dominion.managers.PlaceHolderApi;
@ -49,7 +48,7 @@ public final class Dominion extends JavaPlugin {
}
}
new RegisterEvents(this);
new EventsRegister(this);
Objects.requireNonNull(Bukkit.getPluginCommand("dominion")).setExecutor(new Commands());
bStatsMetrics metrics = new bStatsMetrics(this, 21445);

@ -55,20 +55,16 @@ public class DominionNode {
return node;
} else {
DominionNode childDominion = getLocInDominionNode(node.children, loc);
if (childDominion == null) {
return node;
} else {
return childDominion;
}
return Objects.requireNonNullElse(childDominion, node);
}
}
}
return null;
}
public static boolean isInDominion(@Nullable DominionDTO dominion, Location location) {
public static boolean isInDominion(@Nullable DominionDTO dominion, @NotNull Location location) {
if (dominion == null) return false;
if (!Objects.equals(dominion.getWorld(), location.getWorld().getName())) return false;
if (!Objects.equals(dominion.getWorldUid(), location.getWorld().getUID())) return false;
double x = location.getX();
double y = location.getY();
double z = location.getZ();

@ -1,15 +1,15 @@
package cn.lunadeer.dominion.events;
package cn.lunadeer.dominion;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
public class RegisterEvents {
public class EventsRegister {
private JavaPlugin plugin;
public RegisterEvents(JavaPlugin plugin) {
public EventsRegister(JavaPlugin plugin) {
APIVersion version = GetAPIVersion(plugin);
this.plugin = plugin;
if (version == null) {

@ -8,7 +8,7 @@ import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import static cn.lunadeer.dominion.commands.Apis.hasPermission;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
public class DominionFlag {

@ -21,8 +21,8 @@ import java.time.LocalDateTime;
import java.util.Map;
import static cn.lunadeer.dominion.DominionNode.isInDominion;
import static cn.lunadeer.dominion.commands.Apis.*;
import static cn.lunadeer.dominion.events.Apis.canByPass;
import static cn.lunadeer.dominion.utils.CommandUtils.*;
import static cn.lunadeer.dominion.utils.EventUtils.canByPass;
public class DominionOperate {
/**
@ -391,7 +391,11 @@ public class DominionOperate {
if (location == null) {
int x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2;
int z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2;
World world = Dominion.instance.getServer().getWorld(dominionDTO.getWorld());
World world = dominionDTO.getWorld();
if (world == null) {
Notification.error(sender, "领地所在世界不存在");
return;
}
location = new Location(world, x, player.getLocation().getY(), z);
XLogger.warn("领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName());
}
@ -459,7 +463,11 @@ public class DominionOperate {
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());
World world = dominionDTO.getWorld();
if (world == null) {
Notification.error(player, "领地所在世界不存在");
return;
}
if (location == null) {
location = new Location(world, center_x, player.getLocation().getY(), center_z);
Notification.warn(player, "领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName());

@ -16,9 +16,9 @@ import java.util.Collections;
import java.util.List;
import static cn.lunadeer.dominion.Commands.boolOptions;
import static cn.lunadeer.dominion.commands.Apis.hasPermission;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
import static cn.lunadeer.dominion.commands.Helper.*;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class Group {
@ -181,6 +181,10 @@ public class Group {
}
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length < 2) {
Notification.error(sender, "用法: /dominion group <create|delete|rename|set_flag|add_member|remove_member|select_member|setting|list>");
return;
}
switch (args[1]) {
case "create":
createGroup(sender, args);

@ -9,7 +9,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class Helper {

@ -17,7 +17,7 @@ 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.hasPermission;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
import static cn.lunadeer.dominion.commands.Helper.*;
public class Member {
@ -131,6 +131,10 @@ public class Member {
}
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length < 2) {
Notification.error(sender, "用法: /dominion member <add/set_flag/remove/apply_template/list/setting/select_player/select_template>");
return;
}
switch (args[1]) {
case "add":
Member.member_add(sender, args);

@ -14,8 +14,8 @@ import org.bukkit.entity.Player;
import java.util.List;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.hasPermission;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class Migration {

@ -7,6 +7,8 @@ import cn.lunadeer.dominion.utils.MapRender;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseType;
import org.bukkit.command.CommandSender;
import java.io.File;
@ -15,7 +17,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.lunadeer.dominion.commands.Apis.hasPermission;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
public class Operator {
@ -50,8 +52,11 @@ public class Operator {
Map<String, List<String>> mca_cords = new HashMap<>();
List<DominionDTO> doms = Cache.instance.getDominions();
for (DominionDTO dom : doms) {
if (!mca_cords.containsKey(dom.getWorld())) {
mca_cords.put(dom.getWorld(), new ArrayList<>());
if (dom.getWorld() == null) {
continue;
}
if (!mca_cords.containsKey(dom.getWorld().getName())) {
mca_cords.put(dom.getWorld().getName(), new ArrayList<>());
}
Integer world_x1 = dom.getX1();
Integer world_x2 = dom.getX2();
@ -64,10 +69,10 @@ public class Operator {
for (int x = mca_x1; x <= mca_x2; x++) {
for (int z = mca_z1; z <= mca_z2; z++) {
String file_name = "r." + x + "." + z + ".mca";
if (mca_cords.get(dom.getWorld()).contains(file_name)) {
if (mca_cords.get(dom.getWorld().getName()).contains(file_name)) {
continue;
}
mca_cords.get(dom.getWorld()).add(file_name);
mca_cords.get(dom.getWorld().getName()).add(file_name);
}
}
}
@ -121,6 +126,14 @@ public class Operator {
Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在重新加载配置文件...");
Dominion.config.reload();
DatabaseManager.instance.reConnection(
DatabaseType.valueOf(Dominion.config.getDbType().toUpperCase()),
Dominion.config.getDbHost(),
Dominion.config.getDbPort(),
Dominion.config.getDbName(),
Dominion.config.getDbUser(),
Dominion.config.getDbPass()
);
Notification.info(sender, "配置文件已重新加载");
});
}

@ -5,7 +5,7 @@ import cn.lunadeer.dominion.tuis.SysConfig;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import static cn.lunadeer.dominion.commands.Apis.hasPermission;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
public class SetConfig {
@ -102,14 +102,14 @@ public class SetConfig {
}
private static void adjustSizeY() {
if (Dominion.config.getLimitVert()) {
Dominion.config.setLimitSizeY(Dominion.config.getLimitMaxY() - Dominion.config.getLimitMinY() + 1);
if (Dominion.config.getLimitVert(null)) {
Dominion.config.setLimitSizeY(Dominion.config.getLimitMaxY(null) - Dominion.config.getLimitMinY(null) + 1);
}
}
private static void setLimitMaxY(CommandSender sender, String[] args) {
int maxY = Integer.parseInt(args[2]);
if (maxY <= Dominion.config.getLimitMinY()) {
if (maxY <= Dominion.config.getLimitMinY(null)) {
Notification.error(sender, "最高Y坐标限制不能小于最低Y坐标限制");
return;
}
@ -120,7 +120,7 @@ public class SetConfig {
private static void setLimitMinY(CommandSender sender, String[] args) {
int minY = Integer.parseInt(args[2]);
if (minY >= Dominion.config.getLimitMaxY()) {
if (minY >= Dominion.config.getLimitMaxY(null)) {
Notification.error(sender, "最低Y坐标限制不能大于最高Y坐标限制");
return;
}

@ -15,11 +15,11 @@ import java.util.Collections;
import java.util.List;
import static cn.lunadeer.dominion.Commands.boolOptions;
import static cn.lunadeer.dominion.commands.Apis.hasPermission;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
import static cn.lunadeer.dominion.utils.CommandUtils.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;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class Template {
@ -106,6 +106,10 @@ public class Template {
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length < 2) {
Notification.error(sender, "用法: /dominion template <list|setting|delete|create|set_flag>");
return;
}
switch (args[1]) {
case "list":
TemplateList.show(sender, args);

@ -12,9 +12,9 @@ import org.bukkit.entity.Player;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.hasPermission;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class Title {

@ -20,8 +20,8 @@ import java.util.List;
import java.util.Objects;
import static cn.lunadeer.dominion.DominionNode.isInDominion;
import static cn.lunadeer.dominion.controllers.Apis.getPlayerCurrentDominion;
import static cn.lunadeer.dominion.controllers.Apis.notOwner;
import static cn.lunadeer.dominion.utils.ControllerUtils.getPlayerCurrentDominion;
import static cn.lunadeer.dominion.utils.ControllerUtils.notOwner;
public class DominionController {
@ -92,7 +92,7 @@ public class DominionController {
operator.setResponse(FAIL.addMessage("已经存在名称为 %s 的领地", name));
return;
}
if (!loc1.getWorld().equals(loc2.getWorld())) {
if (!loc1.getWorld().getUID().equals(loc2.getWorld().getUID())) {
operator.setResponse(FAIL.addMessage("选点世界不一致"));
return;
}
@ -103,7 +103,7 @@ public class DominionController {
}
// 检查领地数量是否达到上限
if (amountNotValid(operator)) {
operator.setResponse(FAIL.addMessage("你的领地数量已达上限(%d个)", Dominion.config.getLimitAmount()));
operator.setResponse(FAIL.addMessage("你的领地数量已达上限(%d个)", Dominion.config.getLimitAmount(operator.getPlayer())));
return;
}
int minX = Math.min(loc1.getBlockX(), loc2.getBlockX());
@ -137,10 +137,10 @@ public class DominionController {
}
}
// 创建 dominion (此步骤不会写入数据)
DominionDTO dominion = DominionDTO.create(parent_dominion.getId() == -1 ? operator.getUniqueId() : parent_dominion.getOwner(), name, loc1.getWorld().getName(),
DominionDTO dominion = DominionDTO.create(parent_dominion.getId() == -1 ? operator.getUniqueId() : parent_dominion.getOwner(), name, loc1.getWorld(),
minX, minY, minZ, maxX, maxY, maxZ, parent_dominion);
// 如果parent_dominion不为-1 检查是否在同一世界
if (parent_dominion.getId() != -1 && !parent_dominion.getWorld().equals(dominion.getWorld())) {
if (parent_dominion.getId() != -1 && !parent_dominion.getWorldUid().equals(dominion.getWorldUid())) {
operator.setResponse(FAIL.addMessage("父领地与子领地不在同一世界。"));
return;
}
@ -154,7 +154,7 @@ public class DominionController {
return;
}
// 获取此领地的所有同级领地
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), parent_dominion.getId());
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorldUid(), parent_dominion.getId());
// 检查是否与出生点保护冲突
if (isIntersectSpawn(operator, dominion)) {
operator.setResponse(FAIL.addMessage("与出生点保护冲突"));
@ -169,7 +169,7 @@ public class DominionController {
}
// 检查经济
if (!skipEco) {
if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ() ? dominion.getSquare() : dominion.getVolume(), true, FAIL, SUCCESS)) {
if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ(operator.getPlayer()) ? dominion.getSquare() : dominion.getVolume(), true, FAIL, SUCCESS)) {
return;
}
}
@ -191,7 +191,7 @@ public class DominionController {
if (radius == -1) {
return false;
}
World world = Dominion.instance.getServer().getWorld(dominion.getWorld());
World world = dominion.getWorld();
if (world == null) {
return false;
}
@ -200,7 +200,7 @@ public class DominionController {
, spawn.getBlockX() + radius, spawn.getBlockY() + radius, spawn.getBlockZ() + radius);
}
private static boolean isIntersectSpawn(AbstractOperator operator, String world, int[] cords) {
private static boolean isIntersectSpawn(AbstractOperator operator, @NotNull World world, int[] cords) {
if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false;
}
@ -208,7 +208,7 @@ public class DominionController {
if (radius == -1) {
return false;
}
Location spawn = Objects.requireNonNull(Dominion.instance.getServer().getWorld(world)).getSpawnLocation();
Location spawn = world.getSpawnLocation();
return isIntersect(cords, spawn.getBlockX() - radius, spawn.getBlockY() - radius, spawn.getBlockZ() - radius
, spawn.getBlockX() + radius, spawn.getBlockY() + radius, spawn.getBlockZ() + radius);
}
@ -263,7 +263,7 @@ public class DominionController {
return;
}
// 获取同世界下的所有同级领地
List<DominionDTO> exist_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getParentDomId());
List<DominionDTO> exist_dominions = DominionDTO.selectByParentId(dominion.getWorldUid(), dominion.getParentDomId());
for (DominionDTO exist_dominion : exist_dominions) {
if (isIntersect(exist_dominion, newCords)) {
// 如果是自己跳过
@ -274,7 +274,7 @@ public class DominionController {
}
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功扩展领地 %s %d格", dominion_name, size);
// 检查经济
if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ() ? sqr(newCords) - dominion.getSquare() : vol(newCords) - dominion.getVolume()
if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ(operator.getPlayer()) ? sqr(newCords) - dominion.getSquare() : vol(newCords) - dominion.getVolume()
, true, FAIL, SUCCESS)) return;
// 显示粒子效果
dominion = dominion.setXYZ(newCords);
@ -317,7 +317,7 @@ public class DominionController {
return;
}
// 获取所有的子领地
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId());
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorldUid(), dominion.getId());
for (DominionDTO sub_dominion : sub_dominions) {
if (!isContained(sub_dominion, newCords)) {
operator.setResponse(FAIL.addMessage("缩小后的领地无法包含子领地 %s", sub_dominion.getName()));
@ -326,7 +326,7 @@ public class DominionController {
}
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功缩小领地 %s %d格", dominion_name, size);
// 退还经济
if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ() ? dominion.getSquare() - sqr(newCords) : dominion.getVolume() - vol(newCords)
if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ(operator.getPlayer()) ? dominion.getSquare() - sqr(newCords) : dominion.getVolume() - vol(newCords)
, false, FAIL, SUCCESS)) return;
// 显示粒子效果
dominion = dominion.setXYZ(newCords);
@ -377,7 +377,7 @@ public class DominionController {
DominionDTO.delete(dominion);
// 退还经济
int count;
if (Dominion.config.getEconomyOnlyXZ()) {
if (Dominion.config.getEconomyOnlyXZ(operator.getPlayer())) {
count = dominion.getSquare();
for (DominionDTO sub_dominion : sub_dominions) {
count += sub_dominion.getSquare();
@ -478,9 +478,9 @@ public class DominionController {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地 %s 不存在", dominion_name));
return;
}
World world = Dominion.instance.getServer().getWorld(dominion.getWorld());
World world = dominion.getWorld();
if (world == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "世界 %s 不存在", dominion.getWorld()));
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地所在世界不存在"));
return;
}
Location loc = new Location(world, x, y, z);
@ -679,7 +679,7 @@ public class DominionController {
}
private static List<DominionDTO> getSubDominionsRecursive(DominionDTO dominion) {
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorld(), dominion.getId());
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorldUid(), dominion.getId());
List<DominionDTO> sub_sub_dominions = new ArrayList<>();
for (DominionDTO sub_dominion : sub_dominions) {
sub_sub_dominions.addAll(getSubDominionsRecursive(sub_dominion));
@ -720,24 +720,24 @@ public class DominionController {
operator.setResponse(FAIL.addMessage("领地的任意一边长度不得小于4"));
return true;
}
if (x_length > Dominion.config.getLimitSizeX() && Dominion.config.getLimitSizeX() > 0) {
operator.setResponse(FAIL.addMessage("领地X方向长度不能超过 %d", Dominion.config.getLimitSizeX()));
if (x_length > Dominion.config.getLimitSizeX(operator.getPlayer()) && Dominion.config.getLimitSizeX(operator.getPlayer()) > 0) {
operator.setResponse(FAIL.addMessage("领地X方向长度不能超过 %d", Dominion.config.getLimitSizeX(operator.getPlayer())));
return true;
}
if (y_length > Dominion.config.getLimitSizeY() && Dominion.config.getLimitSizeY() > 0) {
operator.setResponse(FAIL.addMessage("领地Y方向高度不能超过 %d", Dominion.config.getLimitSizeY()));
if (y_length > Dominion.config.getLimitSizeY(operator.getPlayer()) && Dominion.config.getLimitSizeY(operator.getPlayer()) > 0) {
operator.setResponse(FAIL.addMessage("领地Y方向高度不能超过 %d", Dominion.config.getLimitSizeY(operator.getPlayer())));
return true;
}
if (z_length > Dominion.config.getLimitSizeZ() && Dominion.config.getLimitSizeZ() > 0) {
operator.setResponse(FAIL.addMessage("领地Z方向长度不能超过 %d", Dominion.config.getLimitSizeZ()));
if (z_length > Dominion.config.getLimitSizeZ(operator.getPlayer()) && Dominion.config.getLimitSizeZ(operator.getPlayer()) > 0) {
operator.setResponse(FAIL.addMessage("领地Z方向长度不能超过 %d", Dominion.config.getLimitSizeZ(operator.getPlayer())));
return true;
}
if (y2 > Dominion.config.getLimitMaxY()) {
operator.setResponse(FAIL.addMessage("领地Y坐标不能超过 %d", Dominion.config.getLimitMaxY()));
if (y2 > Dominion.config.getLimitMaxY(operator.getPlayer())) {
operator.setResponse(FAIL.addMessage("领地Y坐标不能超过 %d", Dominion.config.getLimitMaxY(operator.getPlayer())));
return true;
}
if (y1 < Dominion.config.getLimitMinY()) {
operator.setResponse(FAIL.addMessage("领地Y坐标不能低于 %d", Dominion.config.getLimitMinY()));
if (y1 < Dominion.config.getLimitMinY(operator.getPlayer())) {
operator.setResponse(FAIL.addMessage("领地Y坐标不能低于 %d", Dominion.config.getLimitMinY(operator.getPlayer())));
return true;
}
return false;
@ -748,10 +748,10 @@ public class DominionController {
if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false;
}
if (Dominion.config.getLimitDepth() == -1) {
if (Dominion.config.getLimitDepth(operator.getPlayer()) == -1) {
return false;
}
if (parent_dom.getId() != -1 && Dominion.config.getLimitDepth() == 0) {
if (parent_dom.getId() != -1 && Dominion.config.getLimitDepth(operator.getPlayer()) == 0) {
operator.setResponse(FAIL.addMessage("不允许创建子领地"));
return true;
}
@ -763,8 +763,8 @@ public class DominionController {
parent_dom = Cache.instance.getDominion(parent_dom.getParentDomId());
level++;
}
if (level >= Dominion.config.getLimitDepth()) {
operator.setResponse(FAIL.addMessage("子领地嵌套深度不能超过 %d", Dominion.config.getLimitDepth()));
if (level >= Dominion.config.getLimitDepth(operator.getPlayer())) {
operator.setResponse(FAIL.addMessage("子领地嵌套深度不能超过 %d", Dominion.config.getLimitDepth(operator.getPlayer())));
return true;
}
return false;
@ -774,14 +774,14 @@ public class DominionController {
if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false;
}
return Cache.instance.getPlayerDominionCount(operator.getUniqueId()) >= Dominion.config.getLimitAmount() && Dominion.config.getLimitAmount() != -1;
return Cache.instance.getPlayerDominionCount(operator.getUniqueId()) >= Dominion.config.getLimitAmount(operator.getPlayer()) && Dominion.config.getLimitAmount(operator.getPlayer()) != -1;
}
private static boolean worldNotValid(AbstractOperator operator, String world) {
private static boolean worldNotValid(AbstractOperator operator, String worldName) {
if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false;
}
return Dominion.config.getWorldBlackList().contains(world);
return Dominion.config.getWorldBlackList(operator.getPlayer()).contains(worldName);
}
private static DominionDTO getExistDomAndIsOwner(AbstractOperator operator, String dominion_name) {
@ -817,7 +817,7 @@ public class DominionController {
SUCCESS.addMessage("你是OP已跳过经济检查。");
return false;
}
float priceOrRefund = count * Dominion.config.getEconomyPrice();
float priceOrRefund = count * Dominion.config.getEconomyPrice(operator.getPlayer());
if (paid) {
if (VaultConnect.instance.getBalance(operator.getPlayer()) < priceOrRefund) {
operator.setResponse(FAIL.addMessage("你的余额不足,需要 %.2f %s", priceOrRefund, VaultConnect.instance.currencyNamePlural()));
@ -826,7 +826,7 @@ public class DominionController {
SUCCESS.addMessage("已扣除 %.2f %s", priceOrRefund, VaultConnect.instance.currencyNamePlural());
VaultConnect.instance.withdrawPlayer(operator.getPlayer(), priceOrRefund);
} else {
float refund = priceOrRefund * Dominion.config.getEconomyRefund();
float refund = priceOrRefund * Dominion.config.getEconomyRefund(operator.getPlayer());
VaultConnect.instance.depositPlayer(operator.getPlayer(), refund);
SUCCESS.addMessage("已退还 %.2f %s", refund, VaultConnect.instance.currencyNamePlural());
}
@ -854,7 +854,7 @@ public class DominionController {
operator.setResponse(FAIL.addMessage("无法获取你的位置"));
return null;
}
if (!operator.getLocation().getWorld().getName().equals(dominion.getWorld())) {
if (!operator.getLocation().getWorld().getUID().equals(dominion.getWorldUid())) {
operator.setResponse(FAIL.addMessage("禁止跨世界操作"));
return null;
}
@ -929,7 +929,7 @@ public class DominionController {
for (DominionDTO sub_dominion : sub_dominions) {
sub_names = sub_dominion.getName() + ", ";
}
if (sub_dominions.size() > 0) {
if (!sub_dominions.isEmpty()) {
sub_names = sub_names.substring(0, sub_names.length() - 2);
WARNING.addMessage("(子领地:%s)", sub_names);
}

@ -2,8 +2,9 @@ package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.utils.ControllerUtils;
import static cn.lunadeer.dominion.controllers.Apis.noAuthToChangeFlags;
import static cn.lunadeer.dominion.utils.ControllerUtils.noAuthToChangeFlags;
public class FlagsController {
@ -15,7 +16,7 @@ public class FlagsController {
* @param value 权限值
*/
public static void setFlag(AbstractOperator operator, String flag, boolean value) {
DominionDTO dominion = Apis.getPlayerCurrentDominion(operator);
DominionDTO dominion = ControllerUtils.getPlayerCurrentDominion(operator);
if (dominion == null) return;
setFlag(operator, flag, value, dominion.getName());
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置领地权限 %s 为 %s", flag, value));

@ -4,8 +4,8 @@ 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;
import static cn.lunadeer.dominion.utils.ControllerUtils.noAuthToChangeFlags;
import static cn.lunadeer.dominion.utils.ControllerUtils.notOwner;
public class GroupController {

@ -2,8 +2,7 @@ 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;
import static cn.lunadeer.dominion.utils.ControllerUtils.*;
public class MemberController {
@ -33,7 +32,7 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName));
return;
}
if (privilege.getAdmin() && notOwner(operator, dominion)) {
if (isAdmin(privilege) && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法移除一个领地管理员", dominionName));
return;
}
@ -69,7 +68,12 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName));
return;
}
if ((flag.equals("admin") || privilege.getAdmin()) && notOwner(operator, dominion)) {
GroupDTO group = GroupDTO.select(privilege.getGroupId());
if (group != null) {
operator.setResponse(FAIL.addMessage("玩家 %s 属于 %s 权限组,无法单独设置权限", player_name, group.getName()));
return;
}
if ((flag.equals("admin") || isAdmin(privilege)) && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他玩家管理员的权限", dominionName));
return;
}
@ -100,6 +104,10 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name));
return;
}
if (dominion.getOwner().equals(player.getUuid())) {
operator.setResponse(FAIL.addMessage("玩家 %s 是领地 %s 的拥有者,不可以被添加为成员", player_name, dominionName));
return;
}
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege != null) {
operator.setResponse(FAIL.addMessage("玩家 %s 已经是领地 %s 的成员", player_name, dominionName));
@ -137,7 +145,7 @@ public class MemberController {
operator.setResponse(FAIL.addMessage("模板 %s 不存在", templateName));
return;
}
if (notOwner(operator, dominion) && privilege.getAdmin()) {
if (notOwner(operator, dominion) && (isAdmin(privilege) || template.getAdmin())) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他管理员的权限", dominionName));
return;
}

@ -13,8 +13,8 @@ import org.bukkit.entity.Player;
import java.util.Map;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.autoPoints;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.autoPoints;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class CreateDominion {

@ -11,7 +11,7 @@ import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class CreateGroup {

@ -8,7 +8,7 @@ import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class CreateTemplate {

@ -10,7 +10,7 @@ import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class EditJoinMessage {

@ -10,7 +10,7 @@ import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class EditLeaveMessage {

@ -14,7 +14,7 @@ import org.bukkit.entity.Player;
import java.util.Objects;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class MemberAdd {

@ -8,7 +8,7 @@ import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class RenameDominion {

@ -11,7 +11,7 @@ import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class RenameGroup {

@ -10,7 +10,7 @@ import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class SetMapColor {

@ -10,6 +10,8 @@ import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import org.bukkit.Location;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.ResultSet;
import java.sql.SQLException;
@ -33,7 +35,7 @@ public class DominionDTO {
Integer id = rs.getInt("id");
UUID owner = UUID.fromString(rs.getString("owner"));
String name = rs.getString("name");
String world = rs.getString("world");
UUID world_uid = UUID.fromString(rs.getString("world_uid"));
Integer x1 = rs.getInt("x1");
Integer y1 = rs.getInt("y1");
Integer z1 = rs.getInt("z1");
@ -48,7 +50,7 @@ public class DominionDTO {
}
String color = rs.getString("color");
DominionDTO dominion = new DominionDTO(id, owner, name, world, x1, y1, z1, x2, y2, z2, parentDomId,
DominionDTO dominion = new DominionDTO(id, owner, name, world_uid, x1, y1, z1, x2, y2, z2, parentDomId,
rs.getString("join_message"),
rs.getString("leave_message"),
flags,
@ -79,41 +81,45 @@ public class DominionDTO {
if (id == -1) {
return new DominionDTO(-1,
UUID.fromString("00000000-0000-0000-0000-000000000000"),
"根领地", "all",
"根领地", UUID.fromString("00000000-0000-0000-0000-000000000000"),
-2147483648, -2147483648, -2147483648,
2147483647, 2147483647, 2147483647, -1);
}
String sql = "SELECT * FROM dominion WHERE id = ? AND id > 0;";
List<DominionDTO> dominions = query(sql, id);
if (dominions.size() == 0) return null;
return dominions.get(0);
if (dominions.isEmpty()) return null;
return dominions.getFirst();
}
public static List<DominionDTO> selectByParentId(String world, Integer parentId) {
String sql = "SELECT * FROM dominion WHERE world = ? AND parent_dom_id = ? AND id > 0;";
return query(sql, world, parentId);
public static List<DominionDTO> selectByParentId(World world, Integer parentId){
return selectByParentId(world.getUID(), parentId);
}
public static List<DominionDTO> selectByLocation(String world, Integer x, Integer y, Integer z) {
String sql = "SELECT * FROM dominion WHERE world = ? AND " +
public static List<DominionDTO> selectByParentId(UUID world_uid, Integer parentId) {
String sql = "SELECT * FROM dominion WHERE world_uid = ? AND parent_dom_id = ? AND id > 0;";
return query(sql, world_uid.toString(), parentId);
}
public static List<DominionDTO> selectByLocation(UUID world_uid, Integer x, Integer y, Integer z) {
String sql = "SELECT * FROM dominion WHERE world_uid = ? AND " +
"x1 <= ? AND x2 >= ? AND " +
"y1 <= ? AND y2 >= ? AND " +
"z1 <= ? AND z2 >= ? AND " + "id > 0;";
return query(sql, world, x, x, y, y, z, z);
return query(sql, world_uid.toString(), x, x, y, y, z, z);
}
public static DominionDTO select(String name) {
String sql = "SELECT * FROM dominion WHERE name = ? AND id > 0;";
List<DominionDTO> dominions = query(sql, name);
if (dominions.size() == 0) return null;
return dominions.get(0);
if (dominions.isEmpty()) return null;
return dominions.getFirst();
}
public static DominionDTO insert(DominionDTO dominion) {
InsertRow insert = new InsertRow().returningAll().table("dominion").onConflictDoNothing(new Field("id", null));
insert.field(dominion.owner)
.field(dominion.name)
.field(dominion.world)
.field(dominion.world_uid)
.field(dominion.x1).field(dominion.y1).field(dominion.z1)
.field(dominion.x2).field(dominion.y2).field(dominion.z2)
.field(dominion.parentDomId)
@ -125,8 +131,8 @@ public class DominionDTO {
try (ResultSet rs = insert.execute()) {
Cache.instance.loadDominions();
List<DominionDTO> dominions = getDTOFromRS(rs);
if (dominions.size() == 0) return null;
return dominions.get(0);
if (dominions.isEmpty()) return null;
return dominions.getFirst();
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString());
return null;
@ -139,7 +145,7 @@ public class DominionDTO {
Cache.instance.loadDominions();
}
private DominionDTO(Integer id, UUID owner, String name, String world,
private DominionDTO(Integer id, UUID owner, String name, UUID world_uid,
Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2,
Integer parentDomId,
String joinMessage, String leaveMessage,
@ -149,7 +155,7 @@ public class DominionDTO {
this.id.value = id;
this.owner.value = owner.toString();
this.name.value = name;
this.world.value = world;
this.world_uid.value = world_uid.toString();
this.x1.value = x1;
this.y1.value = y1;
this.z1.value = z1;
@ -165,13 +171,13 @@ public class DominionDTO {
}
private DominionDTO(Integer id, UUID owner, String name, String world,
private DominionDTO(Integer id, UUID owner, String name, UUID world_uid,
Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2,
Integer parentDomId) {
this.id.value = id;
this.owner.value = owner.toString();
this.name.value = name;
this.world.value = world;
this.world_uid.value = world_uid.toString();
this.x1.value = x1;
this.y1.value = y1;
this.z1.value = z1;
@ -181,20 +187,19 @@ public class DominionDTO {
this.parentDomId.value = parentDomId;
}
public DominionDTO(UUID owner, String name, String world,
public DominionDTO(UUID owner, String name, @NotNull World world,
Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2) {
this(null, owner, name, world, x1, y1, z1, x2, y2, z2, -1);
this(null, owner, name, world.getUID(), x1, y1, z1, x2, y2, z2, -1);
}
public static DominionDTO create(UUID owner, String name, String world,
public static DominionDTO create(UUID owner, String name, @NotNull World 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());
return new DominionDTO(null, owner, name, world.getUID(), 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);
private final Field world = new Field("world", FieldType.STRING);
private final Field x1 = new Field("x1", FieldType.INT);
private final Field y1 = new Field("y1", FieldType.INT);
private final Field z1 = new Field("z1", FieldType.INT);
@ -207,6 +212,7 @@ public class DominionDTO {
private final Map<Flag, Boolean> flags = new HashMap<>();
private final Field tp_location = new Field("tp_location", "default");
private final Field color = new Field("color", "#00BFFF");
private final Field world_uid = new Field("world_uid", FieldType.STRING);
// getters and setters
@ -224,9 +230,9 @@ public class DominionDTO {
.where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) {
List<DominionDTO> dominions = getDTOFromRS(rs);
if (dominions.size() == 0) return null;
if (dominions.isEmpty()) return null;
Cache.instance.loadDominions((Integer) id.value);
return dominions.get(0);
return dominions.getFirst();
} catch (SQLException e) {
DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString());
return null;
@ -247,8 +253,12 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(this.name));
}
public String getWorld() {
return (String) world.value;
public @Nullable World getWorld() {
return Dominion.instance.getServer().getWorld(getWorldUid());
}
public UUID getWorldUid() {
return UUID.fromString((String) world_uid.value);
}
public Integer getX1() {
@ -384,12 +394,12 @@ public class DominionDTO {
} else {
// 0:0:0
String[] loc = ((String) tp_location.value).split(":");
World w = Dominion.instance.getServer().getWorld(getWorld());
World w = getWorld();
if (loc.length == 3 && w != null) {
return new Location(w, Integer.parseInt(loc[0]), Integer.parseInt(loc[1]), Integer.parseInt(loc[2]));
} else {
XLogger.warn("领地传送点数据异常: %s", tp_location);
XLogger.debug("world: %s, loc.length: %d", world, loc.length);
XLogger.debug("world: %s, loc.length: %d", getWorld(), loc.length);
return null;
}
}
@ -401,11 +411,11 @@ public class DominionDTO {
}
public Location getLocation1() {
return new Location(Dominion.instance.getServer().getWorld(getWorld()), getX1(), getY1(), getZ1());
return new Location(getWorld(), getX1(), getY1(), getZ1());
}
public Location getLocation2() {
return new Location(Dominion.instance.getServer().getWorld(getWorld()), getX2(), getY2(), getZ2());
return new Location(getWorld(), getX2(), getY2(), getZ2());
}
public DominionDTO setColor(String color) {

@ -26,7 +26,7 @@ public enum Flag {
CONTAINER("container", "一般容器", "包含:箱子/木桶/潜影盒/盔甲架/展示框", false, false, true),
CRAFT("craft", "使用工作台", "是否可以使用工作台", false, false, true),
CRAFTER("crafter", "合成器", "是否可以修改自动合成器", false, false, true),
CREEPER_EXPLODE("creeper_explode", "实体爆炸", "包含:苦力怕/凋零头颅/末影水晶/火球", false, true, true),
CREEPER_EXPLODE("creeper_explode", "生物破坏", "包含:苦力怕/凋零头颅/末影水晶/火球爆炸等", false, true, true),
COMPARER("comparer", "比较器交互", "是否可以修改比较器状态", false, false, true),
DOOR("door", "门交互", "是否可以使用各种材质的门(包括活板门)", false, false, true),
DRAGON_BREAK_BLOCK("dragon_break_block", "末影龙破坏方块", "末影龙冲撞是否可以破坏方块", false, true, true),
@ -46,6 +46,7 @@ public enum Flag {
HONEY("honey", "蜂巢交互", "是否可以采蜂蜜", false, false, true),
HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true),
HOPPER("hopper", "特殊容器", "包含:漏斗/熔炉/发射器/投掷器/高炉/烟熏炉", false, false, true),
HOPPER_OUTSIDE("hopper_outside", "领地外漏斗对领地内箱子是否生效", "领地外的漏斗是否可以对领地内的箱子生效", false, true, true),
IGNITE("ignite", "点燃", "是否可以使用打火石点火", false, false, true),
ITEM_FRAME_INTERACTIVE("item_frame_interactive", "展示框交互", "是否可以与物品展示框交互(旋转展示框的东西)", false, false, true),
ITEM_FRAME_PROJ_DAMAGE("item_frame_proj_damage", "投掷物是否可以破坏展示框/画", "非玩家发出的投掷物是否可以破坏展示框/画等悬挂物", false, true, true),
@ -56,6 +57,7 @@ public enum Flag {
MOVE("move", "移动", "是否可以移动", true, false, true),
NOTE_BLOCK("note_block", "点击音符盒", "红石音乐或者某些红石机器会用到...", false, false, true),
PLACE("place", "放置方块", "是否可以放置方块(包括:一般方块、展示框、岩浆、水)", false, false, true),
PISTON_OUTSIDE("piston_outside", "活塞是否可以跨领地推动方块", "活塞是否可以往领地内推东西或推东西到领地外", false, true, true),
PRESSURE("pressure", "压力板交互", "是否可以触发各种材质的压力板", false, false, true),
RIDING("riding", "骑乘载具", "是否可以骑乘各种载具", false, false, true),
REPEATER("repeater", "中继器交互", "是否可以与中继器交互", false, false, true),

@ -6,8 +6,13 @@ import cn.lunadeer.minecraftpluginutils.VaultConnect.VaultConnect;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Material;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import javax.annotation.Nullable;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ConfigManager {
public ConfigManager(Dominion plugin) {
@ -21,6 +26,7 @@ public class ConfigManager {
_plugin.reloadConfig();
_file = _plugin.getConfig();
_debug = _file.getBoolean("Debug", false);
_timer = _file.getBoolean("Timer", false);
XLogger.setDebug(_debug);
_db_type = _file.getString("Database.Type", "sqlite");
_db_host = _file.getString("Database.Host", "localhost");
@ -34,21 +40,6 @@ public class ConfigManager {
setAutoCreateRadius(10);
}
_spawn_protection = _file.getInt("Limit.SpawnProtection", 10);
_limit_size_x = _file.getInt("Limit.SizeX", 128);
if (_limit_size_x <= 4 && _limit_size_x != -1) {
XLogger.err("Limit.SizeX 尺寸不能小于 4已重置为 128");
setLimitSizeX(128);
}
_limit_size_y = _file.getInt("Limit.SizeY", 64);
if (_limit_size_y <= 4 && _limit_size_y != -1) {
XLogger.err("Limit.SizeY 尺寸不能小于 4已重置为 64");
setLimitSizeY(64);
}
_limit_size_z = _file.getInt("Limit.SizeZ", 128);
if (_limit_size_z <= 4 && _limit_size_z != -1) {
XLogger.err("Limit.SizeZ 尺寸不能小于 4已重置为 128");
setLimitSizeZ(128);
}
_blue_map = _file.getBoolean("BlueMap", false);
_dynmap = _file.getBoolean("Dynmap", false);
_auto_clean_after_days = _file.getInt("AutoCleanAfterDays", 180);
@ -56,22 +47,7 @@ public class ConfigManager {
XLogger.err("AutoCleanAfterDays 不能等于 0已重置为 180");
setAutoCleanAfterDays(180);
}
_limit_min_y = _file.getInt("Limit.MinY", -64);
_limit_max_y = _file.getInt("Limit.MaxY", 320);
if (_limit_min_y >= _limit_max_y) {
XLogger.err("Limit.MinY 不能大于或等于 Limit.MaxY已重置为 -64 320");
setLimitMinY(-64);
setLimitMaxY(320);
}
_limit_amount = _file.getInt("Limit.Amount", 10);
_limit_depth = _file.getInt("Limit.Depth", 10);
_limit_vert = _file.getBoolean("Limit.Vert", false);
if (_limit_vert && _limit_size_y <= _limit_max_y - _limit_min_y) {
setLimitSizeY(_limit_max_y - _limit_min_y + 1);
XLogger.warn("启用 Limit.Vert 时 Limit.SizeY 不能小于 Limit.MaxY - Limit.MinY已自动调整为 " + (_limit_max_y - _limit_min_y + 1));
}
_limit_op_bypass = _file.getBoolean("Limit.OpByPass", true);
_world_black_list = _file.getStringList("Limit.WorldBlackList");
_check_update = _file.getBoolean("CheckUpdate", true);
_tp_enable = _file.getBoolean("Teleport.Enable", false);
_tp_delay = _file.getInt("Teleport.Delay", 0);
@ -82,9 +58,6 @@ public class ConfigManager {
setTool("ARROW");
}
_economy_enable = _file.getBoolean("Economy.Enable", false);
_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);
}
@ -93,40 +66,125 @@ public class ConfigManager {
_group_title_enable = _file.getBoolean("GroupTitle.Enable", false);
_group_title_prefix = _file.getString("GroupTitle.Prefix", "&#ffffff[");
_group_title_suffix = _file.getString("GroupTitle.Suffix", "&#ffffff]");
GroupLimit defaultGroup = new GroupLimit();
defaultGroup.setLimitSizeX(_file.getInt("Limit.SizeX", 128));
defaultGroup.setLimitSizeY(_file.getInt("Limit.SizeY", 64));
defaultGroup.setLimitSizeZ(_file.getInt("Limit.SizeZ", 128));
defaultGroup.setLimitMinY(_file.getInt("Limit.MinY", -64));
defaultGroup.setLimitMaxY(_file.getInt("Limit.MaxY", 320));
defaultGroup.setLimitAmount(_file.getInt("Limit.Amount", 10));
defaultGroup.setLimitDepth(_file.getInt("Limit.Depth", 3));
defaultGroup.setLimitVert(_file.getBoolean("Limit.Vert", false));
defaultGroup.setWorldBlackList(_file.getStringList("Limit.WorldBlackList"));
defaultGroup.setPrice(_file.getDouble("Economy.Price", 10.0));
defaultGroup.setPriceOnlyXZ(_file.getBoolean("Economy.OnlyXZ", false));
defaultGroup.setRefundRatio(_file.getDouble("Economy.Refund", 0.85));
limits.put("default", defaultGroup);
if (defaultGroup.getLimitSizeX() <= 4 && defaultGroup.getLimitSizeX() != -1) {
XLogger.err("Limit.SizeX 尺寸不能小于 4已重置为 128");
setLimitSizeX(128);
}
if (defaultGroup.getLimitSizeY() <= 4 && defaultGroup.getLimitSizeY() != -1) {
XLogger.err("Limit.SizeY 尺寸不能小于 4已重置为 64");
setLimitSizeY(64);
}
if (defaultGroup.getLimitSizeZ() <= 4 && defaultGroup.getLimitSizeZ() != -1) {
XLogger.err("Limit.SizeZ 尺寸不能小于 4已重置为 128");
setLimitSizeZ(128);
}
if (defaultGroup.getLimitMinY() >= defaultGroup.getLimitMaxY()) {
XLogger.err("Limit.MinY 不能大于或等于 Limit.MaxY已重置为 -64 320");
setLimitMinY(-64);
setLimitMaxY(320);
}
if (defaultGroup.getRefundRatio() < 0.0 || defaultGroup.getRefundRatio() > 1.0) {
XLogger.err("Economy.Refund 设置不合法,已重置为 0.85");
setEconomyRefund(0.85f);
}
if (defaultGroup.getPrice() < 0.0) {
XLogger.err("Economy.Price 设置不合法,已重置为 10.0");
setEconomyPrice(10.0f);
}
if (defaultGroup.getLimitVert() && defaultGroup.getLimitSizeY() <= defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY()) {
XLogger.warn("启用 Limit.Vert 时 Limit.SizeY 不能小于 Limit.MaxY - Limit.MinY已自动调整为 " + (defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY() + 1));
setLimitSizeY(defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY() + 1);
}
if (defaultGroup.getLimitAmount() < 0 && defaultGroup.getLimitAmount() != -1) {
XLogger.err("Limit.Amount 设置不合法,已重置为 10");
setLimitAmount(10);
}
if (defaultGroup.getLimitDepth() < 0 && defaultGroup.getLimitDepth() != -1) {
XLogger.err("Limit.Depth 设置不合法,已重置为 3");
setLimitDepth(3);
}
limits.putAll(GroupLimit.loadGroups(_plugin));
saveAll(); // 回写文件 防止文件中的数据不完整
Flag.loadFromJson(); // 加载 Flag 配置
}
public void saveAll() {
// 删除旧文件
new File(_plugin.getDataFolder(), "config.yml").delete();
// 保存新文件
_plugin.saveDefaultConfig();
// 重新加载
_plugin.reloadConfig();
_file = _plugin.getConfig();
// 保存配置
_file.set("Database.Type", _db_type);
_file.set("Database.Host", _db_host);
_file.set("Database.Port", _db_port);
_file.set("Database.Name", _db_name);
_file.set("Database.User", _db_user);
_file.set("Database.Pass", _db_pass);
_file.set("AutoCreateRadius", _auto_create_radius);
_file.set("Limit.SpawnProtection", _spawn_protection);
_file.set("Limit.SizeX", _limit_size_x);
_file.set("Limit.SizeY", _limit_size_y);
_file.set("Limit.SizeZ", _limit_size_z);
_file.set("BlueMap", _blue_map);
_file.set("Dynmap", _dynmap);
_file.set("AutoCleanAfterDays", _auto_clean_after_days);
_file.set("Limit.MinY", _limit_min_y);
_file.set("Limit.MaxY", _limit_max_y);
_file.set("Limit.Amount", _limit_amount);
_file.set("Limit.Depth", _limit_depth);
_file.set("Limit.Vert", _limit_vert);
_file.set("Limit.MinY", limits.get("default").getLimitMinY());
_file.set("Limit.MaxY", limits.get("default").getLimitMaxY());
_file.set("Limit.SizeX", limits.get("default").getLimitSizeX());
_file.set("Limit.SizeY", limits.get("default").getLimitSizeY());
_file.set("Limit.SizeZ", limits.get("default").getLimitSizeZ());
_file.set("Limit.Amount", limits.get("default").getLimitAmount());
_file.set("Limit.Depth", limits.get("default").getLimitDepth());
_file.set("Limit.Vert", limits.get("default").getLimitVert());
_file.set("Limit.WorldBlackList", limits.get("default").getWorldBlackList());
_file.set("Limit.OpByPass", _limit_op_bypass);
_file.set("Limit.WorldBlackList", _world_black_list);
_file.set("CheckUpdate", _check_update);
_file.set("Teleport.Enable", _tp_enable);
_file.set("Teleport.Delay", _tp_delay);
_file.set("Teleport.CoolDown", _tp_cool_down);
_file.set("AutoCleanAfterDays", _auto_clean_after_days);
_file.set("Tool", _tool);
_file.set("Economy.Enable", _economy_enable);
_file.set("Economy.Price", _economy_price);
_file.set("Economy.OnlyXZ", _economy_only_xz);
_file.set("Economy.Refund", _economy_refund);
_file.set("Economy.Price", limits.get("default").getPrice());
_file.set("Economy.OnlyXZ", limits.get("default").getPriceOnlyXZ());
_file.set("Economy.Refund", limits.get("default").getRefundRatio());
_file.set("FlyPermissionNodes", _fly_permission_nodes);
_file.set("ResidenceMigration", _residence_migration);
_file.set("GroupTitle.Enable", _group_title_enable);
_file.set("GroupTitle.Prefix", _group_title_prefix);
_file.set("GroupTitle.Suffix", _group_title_suffix);
_file.set("BlueMap", _blue_map);
_file.set("Dynmap", _dynmap);
_file.set("CheckUpdate", _check_update);
_file.set("Debug", _debug);
_file.set("Timer", _timer);
_plugin.saveConfig();
}
@ -141,6 +199,10 @@ public class ConfigManager {
XLogger.setDebug(debug);
}
public Boolean TimerEnabled() {
return _timer;
}
public String getDbType() {
return _db_type;
}
@ -186,32 +248,32 @@ public class ConfigManager {
return _db_pass;
}
public Integer getLimitSizeX() {
return _limit_size_x;
public Integer getLimitSizeX(Player player) {
return limits.get(getPlayerGroup(player)).getLimitSizeX();
}
public void setLimitSizeX(Integer max_x) {
_limit_size_x = max_x;
limits.get("default").setLimitSizeX(max_x);
_file.set("Limit.SizeX", max_x);
_plugin.saveConfig();
}
public Integer getLimitSizeY() {
return _limit_size_y;
public Integer getLimitSizeY(Player player) {
return limits.get(getPlayerGroup(player)).getLimitSizeY();
}
public void setLimitSizeY(Integer max_y) {
_limit_size_y = max_y;
limits.get("default").setLimitSizeY(max_y);
_file.set("Limit.SizeY", max_y);
_plugin.saveConfig();
}
public Integer getLimitSizeZ() {
return _limit_size_z;
public Integer getLimitSizeZ(Player player) {
return limits.get(getPlayerGroup(player)).getLimitSizeZ();
}
public void setLimitSizeZ(Integer max_z) {
_limit_size_z = max_z;
limits.get("default").setLimitSizeZ(max_z);
_file.set("Limit.SizeZ", max_z);
_plugin.saveConfig();
}
@ -244,58 +306,58 @@ public class ConfigManager {
_plugin.saveConfig();
}
public Integer getLimitMinY() {
return _limit_min_y;
public Integer getLimitMinY(Player player) {
return limits.get(getPlayerGroup(player)).getLimitMinY();
}
public void setLimitMinY(Integer limit_bottom) {
_limit_min_y = limit_bottom;
limits.get("default").setLimitMinY(limit_bottom);
_file.set("Limit.MinY", limit_bottom);
_plugin.saveConfig();
}
public Integer getLimitMaxY() {
return _limit_max_y;
public Integer getLimitMaxY(Player player) {
return limits.get(getPlayerGroup(player)).getLimitMaxY();
}
public void setLimitMaxY(Integer limit_top) {
_limit_max_y = limit_top;
limits.get("default").setLimitMaxY(limit_top);
_file.set("Limit.MaxY", limit_top);
_plugin.saveConfig();
}
public Integer getLimitAmount() {
return _limit_amount;
public Integer getLimitAmount(Player player) {
return limits.get(getPlayerGroup(player)).getLimitAmount();
}
public void setLimitAmount(Integer limit_amount) {
_limit_amount = limit_amount;
limits.get("default").setLimitAmount(limit_amount);
_file.set("Limit.Amount", limit_amount);
_plugin.saveConfig();
}
public Integer getLimitDepth() {
return _limit_depth;
public Integer getLimitDepth(Player player) {
return limits.get(getPlayerGroup(player)).getLimitDepth();
}
public void setLimitDepth(Integer limit_depth) {
_limit_depth = limit_depth;
limits.get("default").setLimitDepth(limit_depth);
_file.set("Limit.Depth", limit_depth);
_plugin.saveConfig();
}
public Boolean getLimitVert() {
return _limit_vert;
public Boolean getLimitVert(Player player) {
return limits.get(getPlayerGroup(player)).getLimitVert();
}
public void setLimitVert(Boolean limit_vert) {
_limit_vert = limit_vert;
limits.get("default").setLimitVert(limit_vert);
_file.set("Limit.Vert", limit_vert);
_plugin.saveConfig();
}
public List<String> getWorldBlackList() {
return _world_black_list;
public List<String> getWorldBlackList(Player player) {
return limits.get(getPlayerGroup(player)).getWorldBlackList();
}
public Boolean getLimitOpBypass() {
@ -362,32 +424,32 @@ public class ConfigManager {
_plugin.saveConfig();
}
public Float getEconomyPrice() {
return _economy_price;
public Float getEconomyPrice(Player player) {
return limits.get(getPlayerGroup(player)).getPrice().floatValue();
}
public void setEconomyPrice(Float economy_price) {
_economy_price = economy_price;
limits.get("default").setPrice((double) economy_price);
_file.set("Economy.Price", economy_price);
_plugin.saveConfig();
}
public Boolean getEconomyOnlyXZ() {
return _economy_only_xz;
public Boolean getEconomyOnlyXZ(Player player) {
return limits.get(getPlayerGroup(player)).getPriceOnlyXZ();
}
public void setEconomyOnlyXZ(Boolean economy_only_xz) {
_economy_only_xz = economy_only_xz;
limits.get("default").setPriceOnlyXZ(economy_only_xz);
_file.set("Economy.OnlyXZ", economy_only_xz);
_plugin.saveConfig();
}
public Float getEconomyRefund() {
return _economy_refund;
public Float getEconomyRefund(Player player) {
return limits.get(getPlayerGroup(player)).getRefundRatio().floatValue();
}
public void setEconomyRefund(Float economy_refund) {
_economy_refund = economy_refund;
limits.get("default").setRefundRatio((double) economy_refund);
_file.set("Economy.Refund", economy_refund);
_plugin.saveConfig();
}
@ -455,6 +517,7 @@ public class ConfigManager {
private final Dominion _plugin;
private FileConfiguration _file;
private Boolean _debug;
private Boolean _timer;
private String _db_type;
private String _db_host;
@ -465,20 +528,12 @@ public class ConfigManager {
private Integer _auto_create_radius;
private Integer _limit_size_x;
private Integer _limit_size_y;
private Integer _limit_size_z;
private Boolean _limit_op_bypass;
private Boolean _blue_map;
private Boolean _dynmap;
private Integer _auto_clean_after_days;
private Integer _limit_min_y;
private Integer _limit_max_y;
private Integer _limit_amount;
private Integer _limit_depth;
private Boolean _limit_vert;
private List<String> _world_black_list;
private Boolean _check_update;
private Boolean _tp_enable;
@ -487,9 +542,7 @@ public class ConfigManager {
private String _tool;
private Boolean _economy_enable;
private Float _economy_price;
private Boolean _economy_only_xz;
private Float _economy_refund;
private List<String> _fly_permission_nodes;
private Boolean _residence_migration;
private Integer _spawn_protection;
@ -497,4 +550,21 @@ public class ConfigManager {
private Boolean _group_title_enable;
private String _group_title_prefix;
private String _group_title_suffix;
private final Map<String, GroupLimit> limits = new HashMap<>();
private String getPlayerGroup(@Nullable Player player) {
if (player == null) {
return "default";
}
for (String group : limits.keySet()) {
if (group.equals("default")) {
continue;
}
if (player.hasPermission("group." + group)) {
return group;
}
}
return "default";
}
}

@ -1,12 +1,16 @@
package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.databse.*;
import cn.lunadeer.minecraftpluginutils.databse.syntax.AddColumn;
import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.RemoveColumn;
import org.bukkit.World;
import java.sql.ResultSet;
import java.util.List;
public class DatabaseTables {
public static void migrate() {
@ -242,5 +246,18 @@ public class DatabaseTables {
TableColumn player_name_using_group_title_id = new TableColumn("using_group_title_id", FieldType.INT, false, false, true, false, -1);
new AddColumn(player_name_using_group_title_id).table("player_name").ifNotExists().execute();
}
// 2.3.0 change world name to world uid
if (!Common.IsFieldExist("dominion", "world_uid")) {
TableColumn dominion_world_uid = new TableColumn("world_uid", FieldType.STRING, false, false, true, false, "'00000000-0000-0000-0000-000000000000'");
new AddColumn(dominion_world_uid).table("dominion").ifNotExists().execute();
List<World> worlds = Dominion.instance.getServer().getWorlds();
for (World world : worlds) {
String sql = String.format("UPDATE dominion SET world_uid = '%s' WHERE world = '%s';", world.getUID().toString(), world.getName());
DatabaseManager.instance.query(sql);
}
DatabaseManager.instance.query("UPDATE dominion SET world_uid = '00000000-0000-0000-0000-000000000000' WHERE world = 'all';");
new RemoveColumn("world").table("dominion").IfExists().execute();
}
}
}

@ -0,0 +1,241 @@
package cn.lunadeer.dominion.managers;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GroupLimit {
private final YamlConfiguration config;
private final File file_path;
private Integer min_y;
private Integer max_y;
private Integer size_x;
private Integer size_y;
private Integer size_z;
private Integer amount;
private Integer depth;
private Boolean vert;
private List<String> world_black_list;
private Double price;
private Boolean only_xz;
private Double refund;
public GroupLimit() {
this.file_path = null;
this.config = new YamlConfiguration();
}
public GroupLimit(File filePath) {
this.file_path = filePath;
config = YamlConfiguration.loadConfiguration(this.file_path);
setLimitMinY(config.getInt("MinY", -64));
setLimitMaxY(config.getInt("MaxY", 320));
if (getLimitMinY() >= getLimitMaxY()) {
XLogger.err("权限组 %s 的 MinY 不能大于等于 MaxY已重置为 -64 和 320", this.file_path.getName());
setLimitMinY(-64);
setLimitMaxY(320);
}
setLimitSizeX(config.getInt("SizeX", 128));
if (getLimitSizeX() <= 4 && getLimitSizeX() != -1) {
XLogger.err("权限组 %s 的 SizeX 设置过小,已重置为 128", this.file_path.getName());
setLimitSizeX(128);
}
setLimitSizeY(config.getInt("SizeY", 64));
if (getLimitSizeY() <= 4 && getLimitSizeY() != -1) {
XLogger.err("权限组 %s 的 SizeY 设置过小,已重置为 64", this.file_path.getName());
setLimitSizeY(64);
}
setLimitSizeZ(config.getInt("SizeZ", 128));
if (getLimitSizeZ() <= 4 && getLimitSizeZ() != -1) {
XLogger.err("权限组 %s 的 SizeZ 设置过小,已重置为 128", this.file_path.getName());
setLimitSizeZ(128);
}
setLimitAmount(config.getInt("Amount", 10));
if (getLimitAmount() <= 0 && getLimitAmount() != -1) {
XLogger.err("权限组 %s 的 Amount 设置不合法,已重置为 10", this.file_path.getName());
setLimitAmount(10);
}
setLimitDepth(config.getInt("Depth", 3));
if (getLimitDepth() <= 0 && getLimitDepth() != -1) {
XLogger.err("权限组 %s 的 Depth 设置不合法,已重置为 3", this.file_path.getName());
setLimitDepth(3);
}
setLimitVert(config.getBoolean("Vert", false));
setWorldBlackList(config.getStringList("WorldBlackList"));
setPrice(config.getDouble("Price", 10.0));
if (getPrice() < 0.0) {
XLogger.err("权限组 %s 的 Price 设置不合法,已重置为 10.0", this.file_path.getName());
setPrice(10.0);
}
setPriceOnlyXZ(config.getBoolean("OnlyXZ", false));
setRefundRatio(config.getDouble("Refund", 0.85));
if (getRefundRatio() < 0.0 || getRefundRatio() > 1.0) {
XLogger.err("权限组 %s 的 Refund 设置不合法,已重置为 0.85", this.file_path.getName());
setRefundRatio(0.85);
}
save(); // 保存一次确保文件中的数据是合法的
}
public Integer getLimitMinY() {
return min_y;
}
public Integer getLimitMaxY() {
return max_y;
}
public Integer getLimitSizeX() {
return size_x;
}
public Integer getLimitSizeY() {
return size_y;
}
public Integer getLimitSizeZ() {
return size_z;
}
public Integer getLimitAmount() {
return amount;
}
public Integer getLimitDepth() {
return depth;
}
public Boolean getLimitVert() {
return vert;
}
public List<String> getWorldBlackList() {
return world_black_list;
}
public Double getPrice() {
return price;
}
public Boolean getPriceOnlyXZ() {
return only_xz;
}
public Double getRefundRatio() {
return refund;
}
public void setLimitMinY(Integer min_y) {
this.min_y = min_y;
this.config.set("MinY", min_y);
this.save();
}
public void setLimitMaxY(Integer max_y) {
this.max_y = max_y;
this.config.set("MaxY", max_y);
this.save();
}
public void setLimitSizeX(Integer size_x) {
this.size_x = size_x;
this.config.set("SizeX", size_x);
this.save();
}
public void setLimitSizeY(Integer size_y) {
this.size_y = size_y;
this.config.set("SizeY", size_y);
this.save();
}
public void setLimitSizeZ(Integer size_z) {
this.size_z = size_z;
this.config.set("SizeZ", size_z);
this.save();
}
public void setLimitAmount(Integer amount) {
this.amount = amount;
this.config.set("Amount", amount);
this.save();
}
public void setLimitDepth(Integer depth) {
this.depth = depth;
this.config.set("Depth", depth);
this.save();
}
public void setLimitVert(Boolean vert) {
this.vert = vert;
this.config.set("Vert", vert);
this.save();
}
public void setWorldBlackList(List<String> world_black_list) {
this.world_black_list = world_black_list;
this.config.set("WorldBlackList", world_black_list);
this.save();
}
public void setPrice(Double price) {
this.price = price;
this.config.set("Price", price);
this.save();
}
public void setPriceOnlyXZ(Boolean only_xz) {
this.only_xz = only_xz;
this.config.set("OnlyXZ", only_xz);
this.save();
}
public void setRefundRatio(Double refund) {
this.refund = refund;
this.config.set("Refund", refund);
this.save();
}
private void save() {
if (file_path == null) {
return;
}
try {
config.save(file_path);
} catch (Exception e) {
XLogger.err("Failed to save group limit file: " + file_path.getName());
}
}
public static Map<String, GroupLimit> loadGroups(JavaPlugin plugin) {
Map<String, GroupLimit> groups = new HashMap<>();
File root = plugin.getDataFolder();
File groupsDir = new File(root, "groups");
if (!groupsDir.exists()) {
// 创建文件夹 并且从jar中复制文件
plugin.saveResource("groups/sponsor.yml", true);
}
File[] files = groupsDir.listFiles();
if (files == null) {
return groups;
}
for (File file : files) {
String name = file.getName();
if (!name.endsWith(".yml")) {
continue;
}
String groupName = name.substring(0, name.length() - 4);
GroupLimit group = new GroupLimit(file);
groups.put(groupName, group);
}
XLogger.info("共加载了 %d 个领地组。", groups.size());
return groups;
}
}

@ -10,9 +10,9 @@ import org.bukkit.entity.Player;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.notOp;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
import static cn.lunadeer.dominion.utils.TuiUtils.notOp;
import static cn.lunadeer.dominion.tuis.dominion.DominionList.BuildTreeLines;
public class AllDominion {

@ -9,7 +9,7 @@ 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.utils.CommandUtils.playerOnly;
public class Menu {
public static void show(CommandSender sender, String[] args) {
@ -36,9 +36,9 @@ public class Menu {
Line template = Line.create()
.append(Button.create("模板列表").setExecuteCommand("/dominion template list").build())
.append("成员权限模板列表");
Line help = Line.create()
.append(Button.create("指令帮助").setExecuteCommand("/dominion help").build())
.append("查看指令帮助");
// Line help = Line.create()
// .append(Button.create("指令帮助").setExecuteCommand("/dominion help").build())
// .append("查看指令帮助");
Line link = Line.create()
.append(Button.create("使用文档").setOpenURL("https://ssl.lunadeer.cn:14448/doc/23/").build())
.append("在浏览器中打开使用文档");
@ -64,7 +64,7 @@ public class Menu {
view.add(list);
if (Dominion.config.getGroupTitleEnable()) view.add(title);
view.add(template);
view.add(help);
// view.add(help);
view.add(link);
if (Dominion.config.getResidenceMigration()) {
view.add(migrate);

@ -3,6 +3,7 @@ package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.dominion.utils.TuiUtils;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -18,7 +19,7 @@ import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class MigrateList {
@ -31,7 +32,7 @@ public class MigrateList {
return;
}
int page = Apis.getPage(args, 1);
int page = TuiUtils.getPage(args, 1);
ListView view = ListView.create(10, "/dominion migrate_list");

@ -11,9 +11,9 @@ import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.notOp;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
import static cn.lunadeer.dominion.utils.TuiUtils.notOp;
public class SysConfig {
public static void show(CommandSender sender, String[] args) {
@ -41,38 +41,38 @@ public class SysConfig {
Line limitSizeX = Line.create()
.append(Component.text(" X轴(东西)"));
if (Dominion.config.getLimitSizeX() == -1) {
if (Dominion.config.getLimitSizeX(null) == -1) {
limitSizeX.append(Component.text("无限制")).append(Button.create("设置数值").setExecuteCommand("/dominion set_config limit_size_x 64 " + page).build());
} else {
limitSizeX.append(NumChanger.create(Dominion.config.getLimitSizeX(), "/dominion set_config limit_size_x").setPageNumber(page).build());
limitSizeX.append(NumChanger.create(Dominion.config.getLimitSizeX(null), "/dominion set_config limit_size_x").setPageNumber(page).build());
limitSizeX.append(Button.create("设置无限制").setExecuteCommand("/dominion set_config limit_size_x -1 " + page).build());
}
view.add(limitSizeX);
Line limitSizeZ = Line.create()
.append(Component.text(" Z轴(南北)"));
if (Dominion.config.getLimitSizeZ() == -1) {
if (Dominion.config.getLimitSizeZ(null) == -1) {
limitSizeZ.append(Component.text("无限制")).append(Button.create("设置数值").setExecuteCommand("/dominion set_config limit_size_z 64 " + page).build());
} else {
limitSizeZ.append(NumChanger.create(Dominion.config.getLimitSizeZ(), "/dominion set_config limit_size_z").setPageNumber(page).build());
limitSizeZ.append(NumChanger.create(Dominion.config.getLimitSizeZ(null), "/dominion set_config limit_size_z").setPageNumber(page).build());
limitSizeZ.append(Button.create("设置无限制").setExecuteCommand("/dominion set_config limit_size_z -1 " + page).build());
}
view.add(limitSizeZ);
Line limitSizeY = Line.create()
.append(Component.text(" Y轴(垂直)"));
if (!Dominion.config.getLimitVert()) {
if (Dominion.config.getLimitSizeY() == -1) {
if (!Dominion.config.getLimitVert(null)) {
if (Dominion.config.getLimitSizeY(null) == -1) {
limitSizeY.append(Component.text("无限制")).append(Button.create("设置数值").setExecuteCommand("/dominion set_config limit_size_y 64 " + page).build());
} else {
limitSizeY.append(NumChanger.create(Dominion.config.getLimitSizeY(), "/dominion set_config limit_size_y").setPageNumber(page).build());
limitSizeY.append(NumChanger.create(Dominion.config.getLimitSizeY(null), "/dominion set_config limit_size_y").setPageNumber(page).build());
limitSizeY.append(Button.create("设置无限制").setExecuteCommand("/dominion set_config limit_size_y -1 " + page).build());
}
} else {
limitSizeY.append(Component.text(Dominion.config.getLimitSizeY())
limitSizeY.append(Component.text(Dominion.config.getLimitSizeY(null))
.style(Style.style(TextDecoration.STRIKETHROUGH))
.hoverEvent(Component.text("因为垂直自动延伸已开启,此设置不可手动修改")));
}
view.add(limitSizeY);
if (Dominion.config.getLimitVert()) {
if (Dominion.config.getLimitVert(null)) {
view.add(Line.create()
.append("垂直自动延伸")
.append(Button.createGreen("").setExecuteCommand("/dominion set_config limit_vert false " + page).build()));
@ -83,27 +83,27 @@ public class SysConfig {
}
Line limitMaxY = Line.create()
.append(Component.text("最高Y坐标限制"));
limitMaxY.append(NumChanger.create(Dominion.config.getLimitMaxY(), "/dominion set_config limit_max_y").setPageNumber(page).build());
limitMaxY.append(NumChanger.create(Dominion.config.getLimitMaxY(null), "/dominion set_config limit_max_y").setPageNumber(page).build());
view.add(limitMaxY);
Line limitMinY = Line.create()
.append(Component.text("最低Y坐标限制"));
limitMinY.append(NumChanger.create(Dominion.config.getLimitMinY(), "/dominion set_config limit_min_y").setPageNumber(page).build());
limitMinY.append(NumChanger.create(Dominion.config.getLimitMinY(null), "/dominion set_config limit_min_y").setPageNumber(page).build());
view.add(limitMinY);
Line limitAmount = Line.create()
.append(Component.text("每个玩家领地数量限制"));
if (Dominion.config.getLimitAmount() == -1) {
if (Dominion.config.getLimitAmount(null) == -1) {
limitAmount.append(Component.text("无限制")).append(Button.create("设置数值").setExecuteCommand("/dominion set_config limit_amount 3 " + page).build());
} else {
limitAmount.append(NumChanger.create(Dominion.config.getLimitAmount(), "/dominion set_config limit_amount").setPageNumber(page).build());
limitAmount.append(NumChanger.create(Dominion.config.getLimitAmount(null), "/dominion set_config limit_amount").setPageNumber(page).build());
limitAmount.append(Button.create("设置无限制").setExecuteCommand("/dominion set_config limit_amount -1 " + page).build());
}
view.add(limitAmount);
Line limitDepth = Line.create()
.append(Component.text("领地深度限制"));
if (Dominion.config.getLimitDepth() == -1) {
if (Dominion.config.getLimitDepth(null) == -1) {
limitDepth.append(Component.text("无限制")).append(Button.create("设置数值").setExecuteCommand("/dominion set_config limit_depth 64 " + page).build());
} else {
limitDepth.append(NumChanger.create(Dominion.config.getLimitDepth(), "/dominion set_config limit_depth").setPageNumber(page).build());
limitDepth.append(NumChanger.create(Dominion.config.getLimitDepth(null), "/dominion set_config limit_depth").setPageNumber(page).build());
limitDepth.append(Button.create("设置无限制").setExecuteCommand("/dominion set_config limit_depth -1 " + page).build());
}
view.add(limitDepth);
@ -146,9 +146,9 @@ public class SysConfig {
view.add(economy);
Line price = Line.create()
.append(Component.text(" 每方块单价"))
.append(NumChanger.create(Dominion.config.getEconomyPrice(), "/dominion set_config economy_price", 0.1).setPageNumber(page).build());
.append(NumChanger.create(Dominion.config.getEconomyPrice(null), "/dominion set_config economy_price", 0.1).setPageNumber(page).build());
view.add(price);
if (Dominion.config.getEconomyOnlyXZ()) {
if (Dominion.config.getEconomyOnlyXZ(null)) {
view.add(Line.create()
.append(" 仅计价平面积")
.append(Button.createGreen("").setExecuteCommand("/dominion set_config economy_only_xz false " + page).build()));
@ -159,7 +159,7 @@ public class SysConfig {
}
Line refund = Line.create()
.append(Component.text(" 删除/缩小领地退还比例"))
.append(NumChanger.create(Dominion.config.getEconomyRefund(), "/dominion set_config economy_refund", 0.01).setPageNumber(page).build());
.append(NumChanger.create(Dominion.config.getEconomyRefund(null), "/dominion set_config economy_refund", 0.01).setPageNumber(page).build());
view.add(refund);
}
if (Dominion.config.getResidenceMigration()) {

@ -11,8 +11,8 @@ 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.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class TitleList {

@ -14,9 +14,9 @@ import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.commands.Helper.playerAdminDominions;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class DominionList {
public static void show(CommandSender sender, String[] args) {

@ -11,8 +11,8 @@ import net.kyori.adventure.text.format.TextColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.*;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.*;
public class DominionManage {
public static void show(CommandSender sender, String[] args) {

@ -10,8 +10,8 @@ import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class EnvSetting {

@ -10,8 +10,8 @@ import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class GuestSetting {

@ -11,8 +11,8 @@ import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getDominionNameArg_1;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getDominionNameArg_1;
public class SizeInfo {
public static void show(CommandSender sender, String[] args) {

@ -4,7 +4,7 @@ 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.dominion.utils.TuiUtils;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
@ -16,8 +16,8 @@ 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;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.noAuthToManage;
public class GroupList {
@ -42,7 +42,7 @@ public class GroupList {
return;
}
if (noAuthToManage(player, dominion)) return;
int page = Apis.getPage(args, 3);
int page = TuiUtils.getPage(args, 3);
List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId());
ListView view = ListView.create(10, "/dominion group list " + dominion.getName());
view.title("权限组列表");

@ -3,7 +3,7 @@ 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.dominion.utils.TuiUtils;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -12,8 +12,8 @@ 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;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.noAuthToManage;
public class GroupSetting {
public static void show(CommandSender sender, String dominionName, String groupName) {
@ -37,7 +37,7 @@ public class GroupSetting {
return;
}
if (noAuthToManage(player, dominion)) return;
int page = Apis.getPage(args, 4);
int page = TuiUtils.getPage(args, 4);
GroupDTO group = GroupDTO.select(dominion.getId(), args[3]);
if (group == null) {
Notification.error(sender, "权限组 %s 不存在", args[3]);

@ -13,9 +13,9 @@ 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;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
import static cn.lunadeer.dominion.utils.TuiUtils.noAuthToManage;
public class SelectMember {
public static void show(CommandSender sender, String[] args) {

@ -15,10 +15,10 @@ 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;
import static cn.lunadeer.dominion.utils.CommandUtils.CommandParser;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
import static cn.lunadeer.dominion.utils.TuiUtils.noAuthToManage;
public class MemberList {

@ -12,9 +12,9 @@ import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.tuis.Apis.noAuthToManage;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
import static cn.lunadeer.dominion.utils.TuiUtils.noAuthToManage;
public class MemberSetting {
public static void show(CommandSender sender, String dominionName, String playerName, Integer page) {

@ -11,9 +11,9 @@ 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.utils.CommandUtils.CommandParser;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class SelectPlayer {
public static void show(CommandSender sender, String dominionName, Integer page) {

@ -11,9 +11,9 @@ 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.utils.CommandUtils.CommandParser;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class SelectTemplate {

@ -9,8 +9,8 @@ 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.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class TemplateList {

@ -10,8 +10,8 @@ import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.tuis.Apis.getPage;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
public class TemplateSetting {

@ -21,10 +21,13 @@ public class BlueMapConnect {
BlueMapAPI.getInstance().ifPresent(api -> {
Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
for (DominionDTO dominion : Cache.instance.getDominions()) {
if (!world_dominions.containsKey(dominion.getWorld())) {
world_dominions.put(dominion.getWorld(), new ArrayList<>());
if (dominion.getWorld() == null) {
continue;
}
world_dominions.get(dominion.getWorld()).add(dominion);
if (!world_dominions.containsKey(dominion.getWorld().getName())) {
world_dominions.put(dominion.getWorld().getName(), new ArrayList<>());
}
world_dominions.get(dominion.getWorld().getName()).add(dominion);
}
for (Map.Entry<String, List<DominionDTO>> d : world_dominions.entrySet()) {
api.getWorld(d.getKey()).ifPresent(world -> {

@ -1,7 +1,6 @@
package cn.lunadeer.dominion.commands;
package cn.lunadeer.dominion.utils;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
@ -10,7 +9,7 @@ import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
public class Apis {
public class CommandUtils {
public static Player playerOnly(CommandSender sender) {
if (!(sender instanceof Player)) {
Notification.error(sender, "该命令只能由玩家执行");
@ -27,31 +26,14 @@ public class Apis {
return true;
}
public static void sizeInfo(CommandSender sender, DominionDTO dominionDTO) {
Integer x1 = dominionDTO.getX1();
Integer y1 = dominionDTO.getY1();
Integer z1 = dominionDTO.getZ1();
Integer x2 = dominionDTO.getX2();
Integer y2 = dominionDTO.getY2();
Integer z2 = dominionDTO.getZ2();
Notification.info(sender, "领地 %s 的尺寸信息:", dominionDTO.getName());
Notification.info(sender, " 大小: %d x %d x %d", x2 - x1, y2 - y1, z2 - z1);
Notification.info(sender, " 中心坐标: %d %d %d", x1 + (x2 - x1) / 2, y1 + (y2 - y1) / 2, z1 + (z2 - z1) / 2);
Notification.info(sender, " 高度: %d", y2 - y1);
Notification.info(sender, " Y坐标范围 %d ~ %d", y1, y2);
Notification.info(sender, " 体积: %d", (x2 - x1) * (y2 - y1) * (z2 - z1));
Notification.info(sender, " 领地所在世界: %s", dominionDTO.getWorld());
Notification.info(sender, " 领地的对角点坐标: x1=%d y1=%d z1=%d, x2=%d y2=%d z2=%d", x1, y1, z1, x2, y2, z2);
}
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);
Location location2 = new Location(location.getWorld(), location.getX() + size, location.getY() + size, location.getZ() + size);
if (Dominion.config.getLimitVert()) {
location1.setY(Dominion.config.getLimitMinY());
location2.setY(Dominion.config.getLimitMaxY() - 1);
if (Dominion.config.getLimitVert(player)) {
location1.setY(Dominion.config.getLimitMinY(player));
location2.setY(Dominion.config.getLimitMaxY(player) - 1);
}
Map<Integer, Location> points = new HashMap<>();
points.put(0, location1);

@ -1,12 +1,15 @@
package cn.lunadeer.dominion.controllers;
package cn.lunadeer.dominion.utils;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
public class Apis {
public class ControllerUtils {
public static boolean notOwner(AbstractOperator player, DominionDTO dominion) {
if (player.isOp() && Dominion.config.getLimitOpBypass()) return false;
@ -50,4 +53,20 @@ public class Apis {
}
}
/**
* 检查一个成员是否是管理员
* 此方法会同时尝试搜索玩家所在的权限组是否是管理员
*
* @param member 成员权限
* @return 是否是管理员
*/
public static boolean isAdmin(@NotNull MemberDTO member) {
GroupDTO group = GroupDTO.select(member.getGroupId());
if (group == null) {
return member.getAdmin();
} else {
return group.getAdmin();
}
}
}

@ -42,11 +42,14 @@ public class DynmapConnect extends DynmapCommonAPIListener {
String nameLabel = "<div>" + dominion.getName() + "</div>";
double[] xx = {dominion.getX1(), dominion.getX2()};
double[] zz = {dominion.getZ1(), dominion.getZ2()};
if (dominion.getWorld() == null) {
return;
}
AreaMarker marker = this.markerSet_dominion.createAreaMarker(
dominion.getId().toString(),
nameLabel,
true,
dominion.getWorld(),
dominion.getWorld().getName(),
xx,
zz,
false

@ -1,4 +1,4 @@
package cn.lunadeer.dominion.events;
package cn.lunadeer.dominion.utils;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion;
@ -19,7 +19,7 @@ import org.jetbrains.annotations.NotNull;
import javax.annotation.Nullable;
public class Apis {
public class EventUtils {
public static boolean canByPass(Player player, DominionDTO dom, MemberDTO prev) {
if (player.isOp() && Dominion.config.getLimitOpBypass()) {
return true;

@ -1,4 +1,4 @@
package cn.lunadeer.dominion.tuis;
package cn.lunadeer.dominion.utils;
import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO;
@ -10,9 +10,9 @@ import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.commands.Apis.playerOnly;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class Apis {
public class TuiUtils {
public static int getPage(String[] args, int pos) {
int page = 1;

@ -10,7 +10,7 @@ Database:
AutoCreateRadius: 10 #-1 表示不开启
Limit:
SpawnProtection: 10 # 出生点保护半径
SpawnProtection: 10 # 出生点保护半径 出生点此范围内不允许圈地 -1 表示不开启
MinY: -64 # 最小Y坐标
MaxY: 320 # 最大Y坐标
SizeX: 128 # X方向最大长度 -1表示不限制
@ -66,4 +66,6 @@ Dynmap: false
CheckUpdate: true
Debug: false
Debug: false
Timer: false # 性能测试计时器

@ -0,0 +1,20 @@
# >---------------------------------<
# | 圈地限制特殊权限组配置 |
# >---------------------------------<
# 此文件可以作为模板,你可以将此文件复制后重命名为你想要的权限组名,然后修改里面的配置
# 如果你想给赞助玩家或者VIP一些特殊优惠例如更少的圈地价格、更大的领地等你可以在这里配置
# 详细说明参阅 > https://ssl.lunadeer.cn:14448/doc/82/
MinY: -64 # 最小Y坐标
MaxY: 320 # 最大Y坐标
SizeX: 128 # X方向最大长度 -1表示不限制
SizeY: 64 # Y方向最大长度 -1表示不限制
SizeZ: 128 # Z方向最大长度 -1表示不限制
Amount: 10 # 最大领地数量 -1表示不限制
Depth: 3 # 子领地深度 0不允许子领地 -1不限制
Vert: false # 是否自动延伸到 MaxY 和 MinY
WorldBlackList: [ ] # 不允许领地的世界
Price: 10.0 # 方块单价
OnlyXZ: false # 是否只计算xz平面积
Refund: 0.85 # 删除领地退还比例

@ -7,6 +7,7 @@ import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Location;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -14,14 +15,17 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.entity.*;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import java.util.Objects;
import static cn.lunadeer.dominion.events.Apis.checkFlag;
import static cn.lunadeer.dominion.utils.EventUtils.checkFlag;
import static org.bukkit.Material.FARMLAND;
public class EnvironmentEvents implements Listener {
@ -49,6 +53,22 @@ public class EnvironmentEvents implements Listener {
checkFlag(dom, Flag.CREEPER_EXPLODE, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - item frame
public void onItemFrameShot(ProjectileHitEvent event) {
Entity hit = event.getHitEntity();
if (hit == null) {
return;
}
if (event.getEntity().getShooter() instanceof Player) {
return;
}
if (!(hit instanceof Hanging)) {
return;
}
DominionDTO dom = Cache.instance.getDominionByLoc(hit.getLocation());
checkFlag(dom, Flag.CREEPER_EXPLODE, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - armor stand
public void onArmorStandExploded(EntityDamageByEntityEvent event) {
Entity entity = event.getEntity();
@ -289,4 +309,42 @@ public class EnvironmentEvents implements Listener {
DominionDTO dom = Cache.instance.getDominionByLoc(entity.getLocation());
checkFlag(dom, Flag.VILLAGER_SPAWN, event);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onHopper(InventoryMoveItemEvent event) {
Inventory hopper = event.getDestination();
Inventory inventory = event.getSource();
DominionDTO hopperDom = Cache.instance.getDominionByLoc(hopper.getLocation());
DominionDTO inventoryDom = Cache.instance.getDominionByLoc(inventory.getLocation());
if (hopperDom == null && inventoryDom != null) {
checkFlag(inventoryDom, Flag.HOPPER_OUTSIDE, event);
}
if (hopperDom != null && inventoryDom != null) {
if (!hopperDom.getId().equals(inventoryDom.getId())) {
checkFlag(inventoryDom, Flag.HOPPER_OUTSIDE, event);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockPushedByPiston(BlockPistonExtendEvent event) {
Block piston = event.getBlock();
DominionDTO pistonDom = Cache.instance.getDominionByLoc(piston.getLocation());
BlockFace direction = event.getDirection();
Block endBlockAfterPush = piston.getRelative(direction, event.getBlocks().size() + 1);
DominionDTO endBlockDom = Cache.instance.getDominionByLoc(endBlockAfterPush.getLocation());
if (pistonDom != null && endBlockDom == null) {
checkFlag(pistonDom, Flag.PISTON_OUTSIDE, event);
}
if (pistonDom == null && endBlockDom != null) {
checkFlag(endBlockDom, Flag.PISTON_OUTSIDE, event);
}
if (pistonDom != null && endBlockDom != null) {
if (!pistonDom.getId().equals(endBlockDom.getId())) {
if (!endBlockDom.getFlagValue(Flag.PISTON_OUTSIDE) || !pistonDom.getFlagValue(Flag.PISTON_OUTSIDE)) {
event.setCancelled(true);
}
}
}
}
}

@ -31,8 +31,8 @@ import org.bukkit.inventory.Inventory;
import org.bukkit.material.Colorable;
import org.spigotmc.event.entity.EntityMountEvent;
import static cn.lunadeer.dominion.events.Apis.checkFlag;
import static cn.lunadeer.dominion.events.Apis.getInvDominion;
import static cn.lunadeer.dominion.utils.EventUtils.checkFlag;
import static cn.lunadeer.dominion.utils.EventUtils.getInvDominion;
public class PlayerEvents implements Listener {
@EventHandler

@ -43,16 +43,16 @@ public class SelectPointEvents implements Listener {
event.setCancelled(true);
Notification.info(player, "已选择第一个点: %d %d %d", block.getX(), block.getY(), block.getZ());
Location loc = block.getLocation();
if (Dominion.config.getLimitVert()) {
loc.setY(Dominion.config.getLimitMinY());
if (Dominion.config.getLimitVert(player)) {
loc.setY(Dominion.config.getLimitMinY(player));
}
points.put(0, loc);
} else if (action == Action.RIGHT_CLICK_BLOCK) {
event.setCancelled(true);
Notification.info(player, "已选择第二个点: %d %d %d", block.getX(), block.getY(), block.getZ());
Location loc = block.getLocation();
if (Dominion.config.getLimitVert()) {
loc.setY(Dominion.config.getLimitMaxY() - 1);
if (Dominion.config.getLimitVert(player)) {
loc.setY(Dominion.config.getLimitMaxY(player) - 1);
}
points.put(1, loc);
} else {
@ -78,7 +78,7 @@ public class SelectPointEvents implements Listener {
int maxX = Math.max(loc1.getBlockX(), loc2.getBlockX()) + 1;
int maxY = Math.max(loc1.getBlockY(), loc2.getBlockY()) + 1;
int maxZ = Math.max(loc1.getBlockZ(), loc2.getBlockZ()) + 1;
DominionDTO dominion = new DominionDTO(player.getUniqueId(), "", loc1.getWorld().getName(),
DominionDTO dominion = new DominionDTO(player.getUniqueId(), "", loc1.getWorld(),
minX, minY, minZ, maxX, maxY, maxZ);
if (Dominion.config.getEconomyEnable()) {
if (!VaultConnect.instance.economyAvailable()) {
@ -86,12 +86,12 @@ public class SelectPointEvents implements Listener {
return;
}
int count;
if (Dominion.config.getEconomyOnlyXZ()) {
if (Dominion.config.getEconomyOnlyXZ(player)) {
count = dominion.getSquare();
} else {
count = dominion.getVolume();
}
float price = count * Dominion.config.getEconomyPrice();
float price = count * Dominion.config.getEconomyPrice(player);
Notification.info(player, "预计领地创建价格为 %.2f %s", price, VaultConnect.instance.currencyNamePlural());
}
Particle.showBorder(player, dominion);

@ -7,6 +7,7 @@ import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Location;
import org.bukkit.Tag;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -14,14 +15,17 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.entity.*;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import java.util.Objects;
import static cn.lunadeer.dominion.events.Apis.checkFlag;
import static cn.lunadeer.dominion.utils.EventUtils.checkFlag;
import static org.bukkit.Material.FARMLAND;
public class EnvironmentEvents implements Listener {
@ -49,6 +53,22 @@ public class EnvironmentEvents implements Listener {
checkFlag(dom, Flag.CREEPER_EXPLODE, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - item frame
public void onItemFrameShot(ProjectileHitEvent event) {
Entity hit = event.getHitEntity();
if (hit == null) {
return;
}
if (event.getEntity().getShooter() instanceof Player) {
return;
}
if (!(hit instanceof Hanging)) {
return;
}
DominionDTO dom = Cache.instance.getDominionByLoc(hit.getLocation());
checkFlag(dom, Flag.CREEPER_EXPLODE, event);
}
@EventHandler(priority = EventPriority.HIGHEST) // creeper_explode - armor stand
public void onArmorStandExploded(EntityDamageByEntityEvent event) {
Entity entity = event.getEntity();
@ -289,4 +309,43 @@ public class EnvironmentEvents implements Listener {
DominionDTO dom = Cache.instance.getDominionByLoc(entity.getLocation());
checkFlag(dom, Flag.VILLAGER_SPAWN, event);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onHopper(InventoryMoveItemEvent event) {
Inventory hopper = event.getDestination();
Inventory inventory = event.getSource();
DominionDTO hopperDom = Cache.instance.getDominionByLoc(hopper.getLocation());
DominionDTO inventoryDom = Cache.instance.getDominionByLoc(inventory.getLocation());
if (hopperDom == null && inventoryDom != null) {
checkFlag(inventoryDom, Flag.HOPPER_OUTSIDE, event);
}
if (hopperDom != null && inventoryDom != null) {
if (!hopperDom.getId().equals(inventoryDom.getId())) {
checkFlag(inventoryDom, Flag.HOPPER_OUTSIDE, event);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockPushedByPiston(BlockPistonExtendEvent event) {
Block piston = event.getBlock();
DominionDTO pistonDom = Cache.instance.getDominionByLoc(piston.getLocation());
BlockFace direction = event.getDirection();
Block endBlockAfterPush = piston.getRelative(direction, event.getBlocks().size() + 1);
DominionDTO endBlockDom = Cache.instance.getDominionByLoc(endBlockAfterPush.getLocation());
if (pistonDom != null && endBlockDom == null) {
checkFlag(pistonDom, Flag.PISTON_OUTSIDE, event);
}
if (pistonDom == null && endBlockDom != null) {
checkFlag(endBlockDom, Flag.PISTON_OUTSIDE, event);
}
if (pistonDom != null && endBlockDom != null) {
if (!pistonDom.getId().equals(endBlockDom.getId())) {
if (!endBlockDom.getFlagValue(Flag.PISTON_OUTSIDE) || !pistonDom.getFlagValue(Flag.PISTON_OUTSIDE)) {
event.setCancelled(true);
}
}
}
}
}

@ -27,8 +27,8 @@ import org.bukkit.event.vehicle.VehicleDestroyEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.material.Colorable;
import static cn.lunadeer.dominion.events.Apis.checkFlag;
import static cn.lunadeer.dominion.events.Apis.getInvDominion;
import static cn.lunadeer.dominion.utils.EventUtils.checkFlag;
import static cn.lunadeer.dominion.utils.EventUtils.getInvDominion;
public class PlayerEvents implements Listener {
@EventHandler

@ -43,16 +43,16 @@ public class SelectPointEvents implements Listener {
event.setCancelled(true);
Notification.info(player, "已选择第一个点: %d %d %d", block.getX(), block.getY(), block.getZ());
Location loc = block.getLocation();
if (Dominion.config.getLimitVert()) {
loc.setY(Dominion.config.getLimitMinY());
if (Dominion.config.getLimitVert(player)) {
loc.setY(Dominion.config.getLimitMinY(player));
}
points.put(0, loc);
} else if (action == Action.RIGHT_CLICK_BLOCK) {
event.setCancelled(true);
Notification.info(player, "已选择第二个点: %d %d %d", block.getX(), block.getY(), block.getZ());
Location loc = block.getLocation();
if (Dominion.config.getLimitVert()) {
loc.setY(Dominion.config.getLimitMaxY() - 1);
if (Dominion.config.getLimitVert(player)) {
loc.setY(Dominion.config.getLimitMaxY(player) - 1);
}
points.put(1, loc);
} else {
@ -78,7 +78,7 @@ public class SelectPointEvents implements Listener {
int maxX = Math.max(loc1.getBlockX(), loc2.getBlockX()) + 1;
int maxY = Math.max(loc1.getBlockY(), loc2.getBlockY()) + 1;
int maxZ = Math.max(loc1.getBlockZ(), loc2.getBlockZ()) + 1;
DominionDTO dominion = new DominionDTO(player.getUniqueId(), "", loc1.getWorld().getName(),
DominionDTO dominion = new DominionDTO(player.getUniqueId(), "", loc1.getWorld(),
minX, minY, minZ, maxX, maxY, maxZ);
if (Dominion.config.getEconomyEnable()) {
if (!VaultConnect.instance.economyAvailable()) {
@ -86,12 +86,12 @@ public class SelectPointEvents implements Listener {
return;
}
int count;
if (Dominion.config.getEconomyOnlyXZ()) {
if (Dominion.config.getEconomyOnlyXZ(player)) {
count = dominion.getSquare();
} else {
count = dominion.getVolume();
}
float price = count * Dominion.config.getEconomyPrice();
float price = count * Dominion.config.getEconomyPrice(player);
Notification.info(player, "预计领地创建价格为 %.2f %s", price, VaultConnect.instance.currencyNamePlural());
}
Particle.showBorder(player, dominion);