Compare commits

...

115 Commits

Author SHA1 Message Date
11123822e4 add javadoc addr to doc 2024-10-17 21:04:48 +08:00
3f6b7c8a92 add api as submodule 2024-10-17 21:01:21 +08:00
3b09e6c885 remove api to standalone repo 2024-10-17 20:58:24 +08:00
2d2fb9a233 Enforce some api capabilities. 2024-10-17 15:25:27 +08:00
8e490ec57a Fix NoClassDefFoundError when using BlueMap-5.4 2024-10-15 17:35:39 +08:00
f1116fa281 Add InfoTool, which can be used to query dom info by click 2024-10-14 14:24:24 +08:00
dcf39f4097 add gitea ci-cd script with java 17 2024-10-14 10:48:57 +08:00
76a9b27ebd 优化文档 2024-10-14 01:42:22 +08:00
1b48eba6c7 修复了在1.21+版本下无法打开铁砧文本输入UI的问题 2024-10-12 15:19:13 +08:00
01b329a3e7 增强了DominionDTO的api能力,现支持修改信息 2024-10-12 11:01:49 +08:00
7fff24dacf 更新示例api插件地址 2024-10-11 11:52:03 +08:00
8e251504fa 修复了在迁移领地数据到新服务器后无法索引到世界的问题 2024-10-11 11:06:01 +08:00
5732fe0182 丰富了api的相关文档 javadoc,优化了部分api接口命名 2024-10-10 15:21:19 +08:00
a53733a0fb 修正文档错误 2024-10-09 17:25:43 +08:00
5734c97a58 修复一系列bug:
1. 修复在1.21下的CUI报错;
2. 现支持在1.20.1使用java17运行;
2024-10-09 14:45:59 +08:00
a86ce4624f 补充api javadoc 2024-10-08 10:28:49 +08:00
6f4d716d95 修复了lite不自动下载依赖的问题 2024-10-07 17:51:32 +08:00
9017402d06 修补cicd脚本 2024-10-07 16:38:19 +08:00
af7c4ad6b2 修补cicd脚本 2024-10-07 16:15:51 +08:00
6e57cada94 修补cicd脚本 2024-10-07 16:12:13 +08:00
d287b611ad 精简项目结构,提供两种不同下载版本 2024-10-07 16:10:19 +08:00
7046ef0391 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	build.gradle.kts
2024-10-07 16:09:57 +08:00
9eb69a4ecc 精简项目结构,提供两种不同下载版本 2024-10-07 16:09:10 +08:00
7f4ed745d7 文档增加笨蛋文档地址 2024-10-04 17:12:58 +08:00
7bf81b753d 文档增加示例项目地址 2024-10-04 16:27:59 +08:00
086e468f03 更新了API实现方案以支持扩展更多功能 2024-10-04 15:23:36 +08:00
e0e713c097 修复了spigot下偶发的多并发问题 2024-10-03 23:56:50 +08:00
be496aac0d 配置文件新增支持配置圈地最小限制 #28 2024-10-01 00:23:22 +08:00
ed6dc7c878
Merge pull request #27 from yunshuangqwq/patch-1 2024-09-28 16:27:05 +08:00
云霜
901be9f9af
只改了一个字 global-tp.md
厂里没人闲着无聊看了看文档发现了文档的有一个字错了
原:改
现:该
这下读着顺畅多了
2024-09-28 07:42:05 +08:00
897c6f17fd 新增数据库导入导出功能,便于迁移、备份数据库 2024-09-27 17:54:59 +08:00
ab838c5596 优化 en-us 语言文件除 Messages Config Flags 段落外的所有翻译。 2024-09-25 11:42:46 +08:00
1b2e193280 文档:修改配置文件中的部分默认值 2024-09-24 17:03:38 +08:00
d58b343b7c 修改配置文件中的部分默认值 2024-09-24 17:02:38 +08:00
c132f52f99 领地提示消息新增特殊占位符 #26 #19
- `{OWNER}`:会被自动替换为领地主人的名字;
- `{DOM}`:会被自动替换为领地名称;
2024-09-24 16:56:20 +08:00
5cc0750ee9 文档补充:新增允许配置领地默认提示消息 #26 2024-09-24 16:23:36 +08:00
458fc530df 新增允许配置领地默认提示消息 #26 2024-09-24 16:20:24 +08:00
ca2b42a84d 修复不打开权限组称号无法使用Papi的问题 2024-09-24 15:30:26 +08:00
a350e01e4b 实现了 api 支持 2024-09-23 15:04:56 +08:00
5bdd15f442 初步完成API定义 2024-09-23 00:54:16 +08:00
bc2c66bdd9 尝试添加api 2024-09-22 23:45:10 +08:00
e8271927ea 移除 WorldSettings 中的 Allow 配置
该功能本质上为 Limits.Amount,通过配置一个世界的数量为 0 可达到同样的效果。
2024-09-22 17:49:59 +08:00
ab0f2a95dd 修复文档无法查看访客权限文档的问题 2024-09-20 17:02:29 +08:00
6789828dec 介绍文档新增五张笑脸(中文特供) 2024-09-20 16:56:32 +08:00
0611600a72
Merge pull request #21 from cygbs/master
增文言以供古人用之。
2024-09-20 09:36:13 +08:00
cygbs
38c780302d
Fix some issues. 2024-09-20 04:26:33 +08:00
8dc6190f57 新增 PR action 自动检查 2024-09-19 21:27:11 +08:00
cygbs
6ed1f2eaf5
增文言以供古人用之。
为增插件之通用性,特此撰一文言翻译并交以「PR」。望君笑纳!
2024-09-19 18:39:26 +08:00
ff23753c62 补充了文档关于多语言更新说明 2024-09-19 17:26:00 +08:00
72a5a84a65 修复了在1.21中风弹的击退效果无法被拦截的漏洞 #17 2024-09-19 14:44:08 +08:00
99405c3828 领地环境设置新增“允许外部重力方块落入”权限 #18
如果禁止则领地外的重力方块进入领地触地时会变为掉落物,该权限默认为禁止
2024-09-19 14:22:13 +08:00
3a08f41906 新增 MessageDisplay 配置,允许服务器管理员配置消息提示位置 #20 2024-09-18 17:18:04 +08:00
b818fc2153 领地进入/离开提示语新增彩色支持,同时新增部分 Papi 变量 #20 2024-09-18 14:56:28 +08:00
bac6f90196 modify issue template 2024-09-17 20:34:08 +08:00
b6f0d8f8ef add translate note 2024-09-13 09:55:49 +08:00
9f788ae26d 整个烂活儿 2024-09-13 00:34:33 +08:00
e12dd87173 fix translate error 2024-09-12 13:38:20 +08:00
618b5c1810 modify language file load logic 2024-09-12 13:15:52 +08:00
66af44e789 add language support: en-us, ja-jp 2024-09-12 11:41:59 +08:00
dbbcf45266 更新了文档以及关联下载地址页面 2024-09-11 23:39:55 +08:00
b82e6d2364 测试 hangar 发布脚本 2024-09-11 16:09:26 +08:00
278de184ae 测试 hangar 发布脚本 2024-09-11 15:18:06 +08:00
268d17bd4f 测试 hangar 发布脚本 2024-09-11 15:03:47 +08:00
e126a2629e 测试 hangar 发布脚本 2024-09-11 14:26:30 +08:00
1ba7de75cb 测试 hangar 发布脚本 2024-09-11 14:12:29 +08:00
9113d3a043 测试modrinth发布脚本 2024-09-11 11:27:58 +08:00
a12775e0ff 测试modrinth发布脚本 2024-09-11 11:17:23 +08:00
f9a5535c3f 测试modrinth发布脚本 2024-09-11 11:14:19 +08:00
ea8c171858 测试modrinth发布脚本 2024-09-11 11:01:30 +08:00
5d890bc957 测试modrinth发布脚本 2024-09-11 10:53:26 +08:00
864bb65376 测试modrinth发布脚本 2024-09-11 10:40:54 +08:00
4effb8a829 测试modrinth发布脚本 2024-09-11 10:37:09 +08:00
555bb68af3 flags.yml 新增自动注释 便于查看权限功能 2024-09-10 22:20:44 +08:00
0a8e1935be 增加 en-us 文档 2024-09-10 17:37:27 +08:00
bb5d95a6f8 更新readme 2024-09-10 17:02:14 +08:00
d39d1981f2 更新readme 2024-09-10 17:00:09 +08:00
59668604c1 更新readme 2024-09-10 16:58:27 +08:00
c3a2b5db13 更新readme 2024-09-10 16:55:25 +08:00
35ed249fbb 更新readme 2024-09-10 16:45:12 +08:00
cb24f91208 更新readme 2024-09-10 14:22:31 +08:00
456859b645 更新readme 2024-09-10 14:02:52 +08:00
57bc5ada44 更新readme 2024-09-10 12:00:47 +08:00
a0f7ba8a45 更新readme 2024-09-10 11:57:24 +08:00
4a1aecf31a 新增 bedrock ui 分支 2024-09-10 10:19:16 +08:00
d6bb84d777 引入部分文档的多语言 2024-09-08 19:22:38 +08:00
ac995b5c62 引入部分文档的多语言 2024-09-08 19:19:45 +08:00
1f824bc0b9 引入部分文档的多语言 2024-09-08 19:06:48 +08:00
a41e245f5e 引入部分文档的多语言 2024-09-08 18:55:11 +08:00
e995af24fd 引入部分文档的多语言 2024-09-08 18:48:21 +08:00
c541a63ee0 引入部分文档的多语言 2024-09-08 18:36:46 +08:00
48d8742bec 引入部分文档的多语言 2024-09-08 18:26:58 +08:00
e52b4426e7 引入部分文档的多语言 2024-09-08 18:26:45 +08:00
3a9fcc89ad 引入部分文档的多语言 2024-09-08 18:20:46 +08:00
9a402199d1 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	build.gradle.kts
2024-09-08 18:12:30 +08:00
e90f7f674c 引入部分文档的多语言 2024-09-08 18:08:49 +08:00
e158066d88 补充了关于 Residence 领地迁移的文档 2024-09-06 17:31:04 +08:00
18632f9094 卫星地图展示新增所有人名称 #12 2024-09-06 17:25:49 +08:00
04c3036f2c 补充 zh-cn 相关翻译字段 #10 2024-09-06 17:12:12 +08:00
989cad0dd8 实现了单独对世界设置圈地规则功能 #10 2024-09-06 17:08:53 +08:00
40d4ede3fc 实现了单独配置世界圈地规则的功能 2024-09-06 16:42:43 +08:00
1f3fb77b49 更新 readme 文档地址 2024-09-06 11:17:20 +08:00
83a2daaaed 优化了 group limit 以支持 i18n 2024-09-06 11:11:31 +08:00
16728cce6d 完成了 i18n 2024-09-05 21:21:41 +08:00
f2c04df403 实现了 tui 领地管理部分的 i18n 2024-09-05 17:34:27 +08:00
ec66ca545a 修复了在spigot上无法拦截生物进入领地的bug 2024-09-05 11:44:16 +08:00
592ade9c23 修复了部分文本提示缺少内容格式化问题 2024-09-05 09:59:59 +08:00
cdb8431a96 修改文档cicd脚本 2024-09-04 17:04:22 +08:00
bb832fcfc8 修改文档cicd脚本 2024-09-04 17:01:08 +08:00
5821285036 修改文档cicd脚本 2024-09-04 16:59:04 +08:00
71ff9a6131 修改文档cicd脚本 2024-09-04 16:57:44 +08:00
5cb157d7b3 修改文档cicd脚本 2024-09-04 16:55:43 +08:00
c1ecaec48b 部分文档迁移到 github pages 2024-09-04 16:52:37 +08:00
4c5f3a6db1 完成了 flags.json 到 flags.yml 的配置内容迁移,使得权限也支持 i18n 国际化(language中的 Flags 段落) #8 2024-09-04 01:19:34 +08:00
63b1c31953 仓库修复更新-2 2024-09-03 19:42:16 +08:00
b70cfd236a 仓库修复更新 2024-09-03 19:41:48 +08:00
197 changed files with 9236 additions and 1722 deletions

View File

@ -13,6 +13,12 @@ jobs:
uses: https://ssl.lunadeer.cn:14446/actions/checkout@v3 uses: https://ssl.lunadeer.cn:14446/actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
- name: "Set up JDK 17"
uses: https://ssl.lunadeer.cn:14446/actions/setup-java@v3
with:
java-version: '17'
distribution: 'zulu'
cache: gradle
- name: "Set up JDK 21" - name: "Set up JDK 21"
uses: https://ssl.lunadeer.cn:14446/actions/setup-java@v3 uses: https://ssl.lunadeer.cn:14446/actions/setup-java@v3
with: with:
@ -21,9 +27,13 @@ jobs:
cache: gradle cache: gradle
- name: "Build with Gradle" - name: "Build with Gradle"
run: | run: |
./gradlew buildPlugin ./gradlew clean
- name: "Copy jar to staging" ./gradlew shadowJar -PBuildFull=false
run: mkdir staging && cp build/libs/*.jar staging/ ./gradlew shadowJar -PBuildFull=true
- name: "Stage"
run: |
mkdir -p staging
mv build/libs/*.jar staging/
- name: "Build & test" - name: "Build & test"
run: | run: |
echo "done!" echo "done!"
@ -36,7 +46,7 @@ jobs:
- name: "Release" - name: "Release"
uses: https://ssl.lunadeer.cn:14446/zhangyuheng/release-action@main uses: https://ssl.lunadeer.cn:14446/zhangyuheng/release-action@main
with: with:
note: " - 带 `original-` 前缀的文件无法用于运行,请下载不带此前缀的版本。" note: " - `full` 后缀包含所有依赖直接安装即可使用,`lite` 后缀不包含任何依赖,会在第一次安装后启动时自动下载"
files: |- files: |-
staging/*.jar staging/*.jar
api_key: '${{secrets.RELEASE_TOKEN}}' api_key: '${{secrets.RELEASE_TOKEN}}'

View File

@ -15,10 +15,9 @@ assignees: ''
Bug复现步骤 Bug复现步骤
1. Go to '...' 1. 打开冰箱;
2. Click on '....' 2. 将大象放入冰箱;
3. Scroll down to '....' 3. 关上冰箱。
4. See error
**正常情况的表现** **正常情况的表现**
@ -33,6 +32,7 @@ Bug复现步骤
- 服务器系统win, linux - 服务器系统win, linux
- 服务端核心Paper、Spigot - 服务端核心Paper、Spigot
- 服务端版本: - 服务端版本:
- 客户端版本:
- 插件版本: - 插件版本:
**补充信息** **补充信息**

21
.github/workflows/check.yml vendored Normal file
View File

@ -0,0 +1,21 @@
name: Merge/PR Build Check
on: [ pull_request ]
jobs:
build:
permissions: write-all
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: "Set up JDK 21"
uses: actions/setup-java@v3
with:
java-version: '21'
distribution: 'zulu'
cache: gradle
- name: "Build with Gradle"
run: ./gradlew buildPlugin
- name: "Done!"
run: |
echo "done!"

View File

@ -12,24 +12,51 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- name: Set up JDK 21 - name: "Set up JDK 21"
uses: actions/setup-java@v3 uses: actions/setup-java@v3
with: with:
java-version: '21' java-version: '21'
distribution: 'zulu' distribution: 'zulu'
cache: gradle cache: gradle
- name: "Build with Gradle" - name: "Build with Gradle"
run: ./gradlew buildPlugin run: |
- name: "Copy jar to staging" ./gradlew clean
run: mkdir staging && cp build/libs/*.jar staging/ ./gradlew shadowJar -PBuildFull=false
./gradlew shadowJar -PBuildFull=true
- name: "Stage"
run: |
mkdir -p staging
mv build/libs/*.jar staging/
- name: "Build & test" - name: "Build & test"
run: | run: |
TAG=$(echo $GITHUB_REF | sed 's/refs\/tags\///') TAG=$(echo $GITHUB_REF | sed 's/refs\/tags\///')
echo "done!" echo "done!"
- uses: "marvinpinto/action-automatic-releases@latest" - name: "GitHub Release"
uses: "marvinpinto/action-automatic-releases@latest"
with: with:
repo_token: "${{ secrets.GITHUB_TOKEN }}" repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "${{ steps.build.outputs.TAG }}" automatic_release_tag: "${{ steps.build.outputs.TAG }}"
prerelease: false prerelease: false
files: | files: |
staging/*.jar staging/*.jar
- name: "Modrinth Release"
uses: dsx137/modrinth-release-action@main
env:
MODRINTH_TOKEN: ${{ secrets.MODRINTH_TOKEN }}
with:
name: ${{ env.AUTOMATIC_RELEASES_TAG }}
project_id: vVZc7jAV
loaders: bukkit,folia,paper,purpur,spigot
game_versions: 1.20.1:1.20.6,1.21,1.21.1
version_number: ${{ env.AUTOMATIC_RELEASES_TAG }}
files: |
staging/*-lite.jar
changelog: "See https://github.com/ColdeZhang/Dominion/releases/tag/${{ env.AUTOMATIC_RELEASES_TAG }}"
version_type: beta
featured: false
updatable: false
delete_old_files: false
- name: "Hangar Release"
env:
HANGAR_TOKEN: ${{ secrets.HANGAR_API_TOKEN }}
run: ./gradlew build publishPluginPublicationToHangar -PBuildFull=false

55
.github/workflows/wiki.yml vendored Normal file
View File

@ -0,0 +1,55 @@
name: Deploy GitBook with GitHub Pages dependencies preinstalled
on:
push:
branches:
- master
paths:
- 'docs/**'
- '.github/workflows/wiki.yml'
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Setup Node.js environment
uses: actions/setup-node@v4.0.3
with:
node-version: '10.21.0'
- name: Install gitbook-cli
run: |
npm install -g gitbook-cli
- name: Build with gitbook
run: |
gitbook install docs
gitbook build docs
mv docs/_book _site
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
# Deployment job
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

1
.gitignore vendored
View File

@ -111,3 +111,4 @@ buildNumber.properties
# Common working directory # Common working directory
run/ run/
/docs/_book/

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "api"]
path = api
url = https://github.com/ColdeZhang/DominionAPI.git

65
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,65 @@
# Contributing to Dominion
Thank you for considering contributing to Dominion! We welcome contributions from everyone. By participating in this
project, you agree to abide by our code of conduct.
## How to Contribute
### 🪲Reporting Bugs
If you find a bug, please report it by opening an issue on our GitHub repository. Include as much detail as possible,
including steps to reproduce the issue, the expected result, and the actual result.
### 💡Suggesting Enhancements
We welcome suggestions for new features or improvements. Please open an issue on our GitHub repository and describe the
enhancement you would like to see, why you think it would be useful, and any other relevant information.
### 🌐Translating
#### **Translate Plugin Messages**
Since the plugin messages are translated by AI, there must be some mistakes in the translation. If you find any mistakes
(or inappropriate translations), there are two ways to help us improve the translation:
1. Fork the repository & clone the repository to your local.
2. Create a new branch for your translation.
3. Translate the plugin messages.
4. Commit & Push your changes to your fork.
5. Open a pull request, wait for your pull request to be reviewed and merged.
Plugin messages are located in the `languages` directory. Translate the files in the language you want to
- If the language you want to translate to does not exist, create a new file with the language code (e.g., `zh-cn.yml`
for Simplified Chinese).
- If the translation is not up-to-date, please update it from the `zh-cn.yml` file.
- Don't forget to leave your name in the header-comment of the file.
> Plugin messages was uploaded to Crowdin too, you can directly modify the translation on
> the [Crowdin project](https://crowdin.com/project/dominion).
>
> But we **NOT RECOMMEND** this way, because the translation on Crowdin may not be the latest.
>
> ![Crowdin](https://badges.crowdin.net/dominion/localized.svg)
#### **Translate Documentation**
1. Fork the repository & clone the repository to your local.
2. Create a new branch for your translation.
3. Translate the documentation or plugin messages.
4. Commit & Push your changes to your fork.
5. Open a pull request, wait for your pull request to be reviewed and merged.
Documentations are located in the `docs` directory. Translate the files in the language you want to contribute to.
- If the language you want to translate to does not exist, create a new directory with the language code (e.g., `zh-cn`
for Simplified Chinese).
- If the documentation is not up-to-date, please update it from the `zh-cn` directory.
- Don't forget to leave your name and contact information in `docs/YOUR_LANGUAGE_CODE/README.md` below.
## 🫴Getting Help
If you need help, feel free to ask questions by opening an issue on our GitHub repository.
Thank you for contributing ❤!

View File

@ -1,50 +1,55 @@
<div align="center"> <div align="center">
<img src="https://ssl.lunadeer.cn:14437/i/2024/03/28/6604f0cec0f0e.png" alt="" width="70%"> <img src="logos/logo3.png" alt="" width="30%">
[![Documentation](https://img.shields.io/badge/Document-Online-70f3ff?logo=readthedocs)](https://dominion.lunadeer.cn/)
[![GitHub Repository](https://img.shields.io/badge/GitHub-开源地址-blue?logo=github)](https://github.com/ColdeZhang/Dominion) [![GitHub Repository](https://img.shields.io/badge/SourceCode-GitHub-blue?logo=github)](https://github.com/ColdeZhang/Dominion)
[![bStats](https://img.shields.io/badge/bStats-Statistics-eacd76?logo=google-analytics)](https://bstats.org/plugin/bukkit/Dominion/21445) [![bStats](https://img.shields.io/badge/bStats-Statistics-eacd76?logo=google-analytics)](https://bstats.org/plugin/bukkit/Dominion/21445)
[![Hangar](https://img.shields.io/badge/Hangar-Project-bacac6?logo=paper)](https://hangar.papermc.io/zhangyuheng/Dominion)
[![Documentation](https://img.shields.io/badge/在线文档-点击跳转-70f3ff?logo=readthedocs)](https://ssl.lunadeer.cn:14448/doc/23/) [![Latest Build](https://img.shields.io/github/v/release/ColdeZhang/Dominion?label=LatestBuild&logo=github&color=0aa344)](https://github.com/ColdeZhang/Dominion/releases/latest)
[![Latest Build](https://img.shields.io/github/v/release/ColdeZhang/Dominion?label=%E6%9C%80%E6%96%B0%E6%9E%84%E5%BB%BA%E4%B8%8B%E8%BD%BD&logo=github&color=0aa344)](https://github.com/ColdeZhang/Dominion/releases/latest)
[![Latest Build](https://img.shields.io/github/v/release/ColdeZhang/Dominion?label=%E5%A4%87%E7%94%A8%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80&logo=gitea&color=0aa344)](https://ssl.lunadeer.cn:14446/mirror/Dominion/releases) [![Hangar](https://img.shields.io/badge/To-Hangar-004ee9)](https://hangar.papermc.io/zhangyuheng/Dominion)
[![Modrinth](https://img.shields.io/badge/To-Modrinth-1bd96a)](https://modrinth.com/plugin/zhangyuheng-dominion)
[![Spigot](https://img.shields.io/badge/To-Spigot-ed8106)](https://www.spigotmc.org/resources/dominion.119514/)
</div> </div>
--- ---
## 简介 [中文(简体)](README_zh.md) | English
鉴于 Residence 插件的作者项目较多维护压力大无法及时跟进新版本以及适配Folia核心。故开发此插件旨在平替纯净版生存服Residence的使用支持从 ## What's this?
Res 迁移数据)。
**请注意本插件目前处于中期测试稳定阶段绝大多数bug或漏洞已被修复目前已具备完全可用性。但不排除仍然存在某些问题如果遇到任何BUG 欢迎及时在仓库提交 ISSUE 或添加QQ群告知感激不尽。** Dominion is a completely open-source, free, future-proof, territory anti-grief plugin developed specifically for
high-versions minecraft server. The plugin is currently undergoing rapid development and iteration, and we will do our
best to ensure the stability and functionality of the plugin.
## 功能介绍 For detail functions and features of Dominion, you can view [Introduction](intro/intro_en-us.md)
<div align="center">
<img src="resource/img/tui.png" alt="" width="100%"/>
<img src="resource/img/manage.png" alt="" width="100%"/>
<img src="resource/img/migration.png" alt="" width="100%"/>
<img src="resource/img/db.png" alt="" width="100%"/>
<img src="resource/img/performance.png" alt="" width="100%"/>
</div>
## 支持版本 ## Version Support
- 1.20.1+ (Bukkit、Spigot、Paper、Folia) - 1.20.1+ (Bukkit、Spigot、Paper、Folia)
> 需要使用 Java21 运行你的服务端,如果你还在使用 Java17 可以放心替换为 Java21理论上 1.20.1+ 版本的服务端核心可以直接升级到 > Although this plugin supports Spigot, we strongly recommend that you upgrade your core to Paper or its forked (such as
> Java21 启动。 > Purpur) for a better performance experience.
## 建议与反馈 ## For developer
请优先在 [GitHub ISSUE](https://github.com/ColdeZhang/Dominion/issues) 提交您的问题 Dominion provides some simple (for now) APIs for developers to build something amazing depends on Dominion. You can
take a look at [Developer](docs/en-us/developer.md) for more details.
QQ群309428300 ## Help us improve
## 统计 If you encounter any problems during use or have any suggestions, please feel free to open
a [GitHub ISSUE](https://github.com/ColdeZhang/Dominion/issues) about your questions or ideas.
For detailed contribution guidelines (such as **translation** etc.), please see [CONTRIBUTING](CONTRIBUTING.md)。
> **This project was developed under chinese-simplified originally. It's Multi-Language was translated by AI currently.**
> **So, there must be some mistakes in the translation. If you find any mistakes (or inappropriate translations), please**
> **feel free to modify it and submit a pull request. See [Translating](CONTRIBUTING.md#translating) for more details.**
## bStats Statics
<div align="center"> <div align="center">
<img src="https://bstats.org/signatures/bukkit/Dominion.svg" alt="" width="100%"> <img src="https://bstats.org/signatures/bukkit/Dominion.svg" alt="" width="100%">

61
README_zh.md Normal file
View File

@ -0,0 +1,61 @@
<div align="center">
<img src="logos/logo3.png" alt="" width="30%">
[![Documentation](https://img.shields.io/badge/在线文档-点击跳转-70f3ff?logo=readthedocs)](https://dominion.lunadeer.cn/)
[![GitHub Repository](https://img.shields.io/badge/开源地址-GitHub-blue?logo=github)](https://github.com/ColdeZhang/Dominion)
[![bStats](https://img.shields.io/badge/bStats-Statistics-eacd76?logo=google-analytics)](https://bstats.org/plugin/bukkit/Dominion/21445)
[![Latest Build](https://img.shields.io/github/v/release/ColdeZhang/Dominion?label=%E6%9C%80%E6%96%B0%E6%9E%84%E5%BB%BA%E4%B8%8B%E8%BD%BD&logo=github&color=0aa344)](https://github.com/ColdeZhang/Dominion/releases/latest)
[![Latest Build](https://img.shields.io/github/v/release/ColdeZhang/Dominion?label=%E5%A4%87%E7%94%A8%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80&logo=gitea&color=0aa344)](https://ssl.lunadeer.cn:14446/mirror/Dominion/releases)
[![Hangar](https://img.shields.io/badge/To-Hangar-004ee9)](https://hangar.papermc.io/zhangyuheng/Dominion)
[![Modrinth](https://img.shields.io/badge/To-Modrinth-1bd96a)](https://modrinth.com/plugin/zhangyuheng-dominion)
[![Spigot](https://img.shields.io/badge/To-Spigot-ed8106)](https://www.spigotmc.org/resources/dominion.119514/)
</div>
---
中文(简体) | [English](README.md)
## 简介
Dominion 是一个完全开源、免费,专为高版本开发,面向未来的全新领地保护插件。插件目前处于快速的开发、迭代阶段,我们会尽力保证插件的稳定性和功能性。
关于本插件的功能特性,您可以查看 [功能介绍](intro/intro_zh-cn.md)。
## 支持版本
- 1.20.1+ (Bukkit、Spigot、Paper、Folia)
> 虽然本插件支持 Spigot但是我们强烈建议您将您的核心升级到 Paper 或其分支核心(如 Purpur以获得更好的性能体验。
## 帮助我们不断改进
如果您在使用过程中遇到任何问题,或者有任何建议,欢迎在 [GitHub ISSUE](https://github.com/ColdeZhang/Dominion/issues) 提交您的问题或想法。
详细的参与贡献指南请查看 [CONTRIBUTING](CONTRIBUTING.md)。
交流QQ群309428300
## 开发者指南
Dominion 提供了一些简单只是暂时后续会逐步增强api的 API 供开发者基于 Dominion
构建一些更有趣的东西。您可以查看 [开发者指南](docs/zh-cn/developer.md) 了解更多细节。
## 整个烂活儿
| | Dominion | R插件 | G插件 |
|---------|----------|-----|-----|
| 纳秒级索引 | 😊 | 😑 | 😭 |
| 权限组快捷配置 | 😊 | 😭 | 😑 |
| 开源可信 | 😊 | 😑 | 😑 |
| 高版本快速跟进 | 😊 | 😭 | 😑 |
| 完全免费 | 😊 | 😑 | 😑 |
## 统计
<div align="center">
<img src="https://bstats.org/signatures/bukkit/Dominion.svg" alt="" width="100%">
</div>

1
api Submodule

@ -0,0 +1 @@
Subproject commit 9a22a3e453ef0391741b6282a5b7f7219bfbbb0c

View File

@ -1,13 +1,20 @@
import io.papermc.hangarpublishplugin.model.Platforms
plugins { plugins {
id("java") id("java")
id("com.github.johnrengelman.shadow") version "8.1.1" id("com.github.johnrengelman.shadow") version "8.1.1"
id("io.papermc.hangar-publish-plugin") version "0.1.2"
} }
var BuildFull = properties["BuildFull"].toString() == "true"
var libraries = listOf<String>()
libraries = libraries + "cn.lunadeer:MinecraftPluginUtils:2.0.7"
group = "cn.lunadeer" group = "cn.lunadeer"
version = "2.5.1-beta" version = "2.14.1-beta"
java { java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21)) toolchain.languageVersion.set(JavaLanguageVersion.of(17))
} }
// utf-8 // utf-8
@ -26,7 +33,6 @@ allprojects {
maven("https://repo.papermc.io/repository/maven-public/") maven("https://repo.papermc.io/repository/maven-public/")
maven("https://jitpack.io") maven("https://jitpack.io")
maven("https://repo.mikeprimm.com/") maven("https://repo.mikeprimm.com/")
maven("https://ssl.lunadeer.cn:14454/repository/maven-snapshots/")
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
} }
@ -35,17 +41,37 @@ allprojects {
compileOnly("us.dynmap:DynmapCoreAPI:3.4") compileOnly("us.dynmap:DynmapCoreAPI:3.4")
compileOnly("me.clip:placeholderapi:2.11.6") compileOnly("me.clip:placeholderapi:2.11.6")
implementation("cn.lunadeer:MinecraftPluginUtils:1.3.8-SNAPSHOT") if (!BuildFull) {
implementation("org.yaml:snakeyaml:2.0") libraries.forEach {
compileOnly(it)
}
} else {
libraries.forEach {
implementation(it)
}
}
} }
tasks.processResources { tasks.processResources {
outputs.upToDateWhen { false } outputs.upToDateWhen { false }
// copy languages folder from PROJECT_DIR/languages to core/src/main/resources
from(file("${projectDir}/languages")) {
into("languages")
}
// replace @version@ in plugin.yml with project version // replace @version@ in plugin.yml with project version
filesMatching("**/plugin.yml") { filesMatching("**/plugin.yml") {
filter { filter {
it.replace("@version@", rootProject.version.toString()) it.replace("@version@", rootProject.version.toString())
} }
if (!BuildFull) {
var libs = "libraries: ["
libraries.forEach {
libs += "$it,"
}
filter {
it.replace("libraries: [ ]", libs.substring(0, libs.length - 1) + "]")
}
}
} }
} }
@ -53,6 +79,8 @@ allprojects {
archiveClassifier.set("") archiveClassifier.set("")
archiveVersion.set(project.version.toString()) archiveVersion.set(project.version.toString())
dependsOn(tasks.withType<ProcessResources>()) dependsOn(tasks.withType<ProcessResources>())
// add -lite to the end of the file name if BuildLite is true or -full if BuildLite is false
archiveFileName.set("${project.name}-${project.version}${if (BuildFull) "-full" else "-lite"}.jar")
} }
} }
@ -67,7 +95,29 @@ tasks.shadowJar {
archiveVersion.set(project.version.toString()) archiveVersion.set(project.version.toString())
} }
tasks.register("buildPlugin") { // <<<< RUN THIS TASK TO BUILD PLUGIN tasks.register("Clean&Build") { // <<<< RUN THIS TASK TO BUILD PLUGIN
dependsOn(tasks.clean) dependsOn(tasks.clean)
dependsOn(tasks.shadowJar) dependsOn(tasks.shadowJar)
}
hangarPublish {
publications.register("plugin") {
version.set(project.version as String) // use project version as publication version
id.set("Dominion")
channel.set("Beta")
changelog.set("See https://github.com/ColdeZhang/Dominion/releases/tag/v${project.version}")
apiKey.set(System.getenv("HANGAR_TOKEN"))
// register platforms
platforms {
register(Platforms.PAPER) {
jar.set(tasks.shadowJar.flatMap { it.archiveFile })
println("ShadowJar: ${tasks.shadowJar.flatMap { it.archiveFile }}")
platformVersions.set(listOf("1.20.1-1.20.6","1.21.x"))
}
}
}
}
tasks.named("publishPluginPublicationToHangar") {
dependsOn(tasks.named("jar"))
} }

View File

@ -3,7 +3,7 @@ plugins {
} }
java { java {
toolchain.languageVersion.set(JavaLanguageVersion.of(21)) toolchain.languageVersion.set(JavaLanguageVersion.of(17))
} }
// utf-8 // utf-8
@ -12,5 +12,6 @@ tasks.withType<JavaCompile> {
} }
dependencies { dependencies {
implementation(project(":api"))
compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT")
} }

View File

@ -1,11 +1,12 @@
package cn.lunadeer.dominion; package cn.lunadeer.dominion;
import cn.lunadeer.dominion.api.DominionAPI;
import cn.lunadeer.dominion.dtos.*; import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.utils.map.MapRender; import cn.lunadeer.dominion.utils.MessageDisplay;
import cn.lunadeer.dominion.utils.Particle; import cn.lunadeer.dominion.utils.Particle;
import cn.lunadeer.dominion.utils.ResMigration; import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.dominion.utils.map.MapRender;
import cn.lunadeer.minecraftpluginutils.AutoTimer; import cn.lunadeer.minecraftpluginutils.AutoTimer;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.GameMode; import org.bukkit.GameMode;
@ -205,16 +206,7 @@ public class Cache {
}); });
} }
/** public DominionDTO getPlayerCurrentDominion(@NotNull Player player) {
* 获取玩家当前所在领地
* 此方法会先判断缓存中是否有玩家当前所在领地如果没有则遍历所有领地判断玩家所在位置
* 如果玩家不在任何领地内则返回null
* 如果玩家在领地内则返回领地信息
*
* @param player 玩家
* @return 玩家当前所在领地
*/
public DominionDTO getPlayerCurrentDominion(Player player) {
try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) { try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) {
Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId()); Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId());
DominionDTO last_dominion = null; DominionDTO last_dominion = null;
@ -239,14 +231,18 @@ public class Cache {
return last_dominion; return last_dominion;
} }
if (last_dom_id != -1) { if (last_dom_id != -1) {
String msg = last_dominion.getLeaveMessage(); MessageDisplay.show(player, Dominion.config.getMessageDisplayJoinLeave(),
msg = msg.replace("${DOM_NAME}", last_dominion.getName()); last_dominion.getLeaveMessage()
Notification.actionBar(player, msg); .replace("{DOM}", last_dominion.getName())
.replace("{OWNER}", getPlayerName(last_dominion.getOwner()))
);
} }
if (current_dom_id != -1) { if (current_dom_id != -1) {
String msg = current_dominion.getJoinMessage(); MessageDisplay.show(player, Dominion.config.getMessageDisplayJoinLeave(),
msg = msg.replace("${DOM_NAME}", current_dominion.getName()); current_dominion.getJoinMessage()
Notification.actionBar(player, msg); .replace("{DOM}", current_dominion.getName())
.replace("{OWNER}", getPlayerName(current_dominion.getOwner()))
);
} }
lightOrNot(player, current_dominion); // 发光检查 lightOrNot(player, current_dominion); // 发光检查
@ -264,6 +260,10 @@ public class Cache {
} }
} }
public DominionDTO getDominionByLoc(@NotNull Location loc) {
return dominion_trees.getLocInDominionDTO(loc);
}
/** /**
* 玩家退出时调用 用于清除玩家当前所在领地 * 玩家退出时调用 用于清除玩家当前所在领地
* 会将玩家当前所在领地设置为null * 会将玩家当前所在领地设置为null
@ -343,28 +343,16 @@ public class Cache {
} }
} }
public DominionDTO getDominionByLoc(Location loc) { public GroupDTO getGroup(@NotNull Integer id) {
return dominion_trees.getLocInDominionDTO(loc);
}
public GroupDTO getGroup(Integer id) {
return id_groups.get(id); return id_groups.get(id);
} }
/** public MemberDTO getMember(@NotNull Player player, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
* 获取玩家在指定领地的特权
* 如果玩家不存在特权则返回null
*
* @param player 玩家
* @param dominion 领地
* @return 特权表
*/
public MemberDTO getMember(Player player, DominionDTO dominion) {
if (!player_uuid_to_member.containsKey(player.getUniqueId())) return null; if (!player_uuid_to_member.containsKey(player.getUniqueId())) return null;
return player_uuid_to_member.get(player.getUniqueId()).get(dominion.getId()); return player_uuid_to_member.get(player.getUniqueId()).get(dominion.getId());
} }
public MemberDTO getMember(UUID player_uuid, DominionDTO dominion) { public MemberDTO getMember(@NotNull UUID player_uuid, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
if (!player_uuid_to_member.containsKey(player_uuid)) return null; if (!player_uuid_to_member.containsKey(player_uuid)) return null;
return player_uuid_to_member.get(player_uuid).get(dominion.getId()); return player_uuid_to_member.get(player_uuid).get(dominion.getId());
} }
@ -383,10 +371,20 @@ public class Cache {
return groups; return groups;
} }
public DominionDTO getDominion(Integer id) { public DominionDTO getDominion(@NotNull Integer id) {
return id_dominions.get(id); return id_dominions.get(id);
} }
public String getPlayerName(UUID uuid) {
if (!player_name_cache.containsKey(uuid)) {
PlayerDTO playerDTO = PlayerDTO.select(uuid);
if (playerDTO != null) {
player_name_cache.put(uuid, playerDTO.getLastKnownName());
}
}
return player_name_cache.getOrDefault(uuid, "Unknown");
}
public int getPlayerDominionCount(UUID player_uuid) { public int getPlayerDominionCount(UUID player_uuid) {
int count = 0; int count = 0;
for (DominionDTO dominion : id_dominions.values()) { for (DominionDTO dominion : id_dominions.values()) {
@ -416,7 +414,7 @@ public class Cache {
return residence_data.get(player_uuid); return residence_data.get(player_uuid);
} }
public List<DominionDTO> getDominions() { public @NotNull List<cn.lunadeer.dominion.api.dtos.DominionDTO> getAllDominions() {
return new ArrayList<>(id_dominions.values()); return new ArrayList<>(id_dominions.values());
} }
@ -452,6 +450,7 @@ public class Cache {
private static final long UPDATE_INTERVAL = 1000 * 4; private static final long UPDATE_INTERVAL = 1000 * 4;
private boolean recheckPlayerState = false; // 是否需要重新检查玩家状态发光飞行 private boolean recheckPlayerState = false; // 是否需要重新检查玩家状态发光飞行
public final Map<UUID, LocalDateTime> NextTimeAllowTeleport = new java.util.HashMap<>(); public final Map<UUID, LocalDateTime> NextTimeAllowTeleport = new java.util.HashMap<>();
private final Map<UUID, String> player_name_cache = new HashMap<>();
private Map<UUID, List<ResMigration.ResidenceNode>> residence_data = null; private Map<UUID, List<ResMigration.ResidenceNode>> residence_data = null;
@ -595,7 +594,7 @@ public class Cache {
} }
} }
public @Nullable GroupDTO getPlayerUsingGroupTitle(UUID uuid) { public @Nullable GroupDTO getPlayerUsingGroupTitle(@NotNull UUID uuid) {
if (!Dominion.config.getGroupTitleEnable()) { if (!Dominion.config.getGroupTitleEnable()) {
return null; return null;
} }

View File

@ -2,15 +2,18 @@ package cn.lunadeer.dominion;
import cn.lunadeer.dominion.commands.*; import cn.lunadeer.dominion.commands.*;
import cn.lunadeer.dominion.controllers.PlayerController; import cn.lunadeer.dominion.controllers.PlayerController;
import cn.lunadeer.dominion.cuis.*;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.*; import cn.lunadeer.dominion.uis.cuis.*;
import cn.lunadeer.dominion.tuis.dominion.DominionList; import cn.lunadeer.dominion.uis.tuis.AllDominion;
import cn.lunadeer.dominion.tuis.dominion.DominionManage; import cn.lunadeer.dominion.uis.tuis.Menu;
import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting; import cn.lunadeer.dominion.uis.tuis.MigrateList;
import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting; import cn.lunadeer.dominion.uis.tuis.TitleList;
import cn.lunadeer.dominion.tuis.dominion.manage.SizeInfo; import cn.lunadeer.dominion.uis.tuis.dominion.DominionList;
import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
import cn.lunadeer.dominion.uis.tuis.dominion.manage.EnvSetting;
import cn.lunadeer.dominion.uis.tuis.dominion.manage.GuestSetting;
import cn.lunadeer.dominion.uis.tuis.dominion.manage.SizeInfo;
import cn.lunadeer.dominion.utils.TuiUtils; import cn.lunadeer.dominion.utils.TuiUtils;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -115,12 +118,15 @@ public class Commands implements TabExecutor {
case "export_mca": case "export_mca":
Operator.exportMca(sender, args); Operator.exportMca(sender, args);
break; break;
case "sys_config": case "export_db":
SysConfig.show(sender, args); Operator.exportDatabase(sender, args);
break; break;
case "set_config": case "import_db":
SetConfig.handler(sender, args); Operator.importDatabase(sender, args);
break; break;
// case "set_config":
// SetConfig.handler(sender, args);
// break;
case "all_dominion": case "all_dominion":
AllDominion.show(sender, args); AllDominion.show(sender, args);
break; break;
@ -216,6 +222,9 @@ public class Commands implements TabExecutor {
"reload_cache", "reload_cache",
"reload_config", "reload_config",
"export_mca", "export_mca",
"export_db",
"import_db",
"version",
"sys_config", "sys_config",
"all_dominion", "all_dominion",
"set_map_color", "set_map_color",

View File

@ -39,14 +39,14 @@ public final class Dominion extends JavaPlugin {
new Scheduler(this); new Scheduler(this);
AutoClean.run(); AutoClean.run();
Cache.instance = new Cache(); Cache.instance = new Cache();
DominionInterface.instance = new DominionInterface();
if (config.getGroupTitleEnable()) { if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { new PlaceHolderApi(this);
new PlaceHolderApi(this); }
} else { if (config.getGroupTitleEnable() && !Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
XLogger.warn(Translation.Messages_PlaceholderAPINotFound); XLogger.warn(Translation.Messages_PlaceholderAPINotFound);
config.setGroupTitleEnable(false); config.setGroupTitleEnable(false);
}
} }
new EventsRegister(this); new EventsRegister(this);

View File

@ -0,0 +1,76 @@
package cn.lunadeer.dominion;
import cn.lunadeer.dominion.api.DominionAPI;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class DominionInterface implements DominionAPI {
public static DominionInterface instance;
@Override
public DominionDTO getPlayerCurrentDominion(@NotNull Player player) {
return Cache.instance.getPlayerCurrentDominion(player);
}
@Override
public DominionDTO getDominionByLoc(@NotNull Location loc) {
return Cache.instance.getDominionByLoc(loc);
}
@Override
public GroupDTO getGroup(@NotNull Integer id) {
return Cache.instance.getGroup(id);
}
@Override
public MemberDTO getMember(@NotNull Player player, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
return Cache.instance.getMember(player.getUniqueId(), dominion);
}
@Override
public MemberDTO getMember(@NotNull UUID player_uuid, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
return Cache.instance.getMember(player_uuid, dominion);
}
@Override
public DominionDTO getDominion(@NotNull Integer id) {
return Cache.instance.getDominion(id);
}
@Override
public @NotNull List<cn.lunadeer.dominion.api.dtos.DominionDTO> getAllDominions() {
return Cache.instance.getAllDominions();
}
@Override
public @Nullable GroupDTO getPlayerUsingGroupTitle(@NotNull UUID uuid) {
return Cache.instance.getPlayerUsingGroupTitle(uuid);
}
@Override
public @NotNull List<cn.lunadeer.dominion.api.dtos.Flag> getEnvironmentFlagsEnabled() {
return new ArrayList<>(Flag.getEnvironmentFlagsEnabled());
}
@Override
public @NotNull List<cn.lunadeer.dominion.api.dtos.Flag> getPrivilegeFlagsEnabled() {
return new ArrayList<>(Flag.getPrivilegeFlagsEnabled());
}
@Override
public cn.lunadeer.dominion.api.dtos.@Nullable Flag getFlagByName(@NotNull String flagName) {
return Flag.getFlag(flagName);
}
}

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion; package cn.lunadeer.dominion;
import cn.lunadeer.minecraftpluginutils.Common;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -22,12 +23,22 @@ public class EventsRegister {
registerEvents("cn.lunadeer.dominion.events_v1_21.PlayerEvents"); registerEvents("cn.lunadeer.dominion.events_v1_21.PlayerEvents");
registerEvents("cn.lunadeer.dominion.events_v1_21.EnvironmentEvents"); registerEvents("cn.lunadeer.dominion.events_v1_21.EnvironmentEvents");
registerEvents("cn.lunadeer.dominion.events_v1_21.SelectPointEvents"); registerEvents("cn.lunadeer.dominion.events_v1_21.SelectPointEvents");
if (Common.isPaper()) {
registerEvents("cn.lunadeer.dominion.events_v1_21.special.Paper");
} else {
registerEvents("cn.lunadeer.dominion.events_v1_21.special.Spigot");
}
break; break;
case v1_20_1: case v1_20_1:
XLogger.debug("Load API version: 1.20.1"); XLogger.debug("Load API version: 1.20.1");
registerEvents("cn.lunadeer.dominion.events_v1_20_1.PlayerEvents"); registerEvents("cn.lunadeer.dominion.events_v1_20_1.PlayerEvents");
registerEvents("cn.lunadeer.dominion.events_v1_20_1.EnvironmentEvents"); registerEvents("cn.lunadeer.dominion.events_v1_20_1.EnvironmentEvents");
registerEvents("cn.lunadeer.dominion.events_v1_20_1.SelectPointEvents"); registerEvents("cn.lunadeer.dominion.events_v1_20_1.SelectPointEvents");
if (Common.isPaper()) {
registerEvents("cn.lunadeer.dominion.events_v1_20_1.special.Paper");
} else {
registerEvents("cn.lunadeer.dominion.events_v1_20_1.special.Spigot");
}
break; break;
} }
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) { } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {

View File

@ -4,8 +4,8 @@ import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.FlagsController; import cn.lunadeer.dominion.controllers.FlagsController;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting; import cn.lunadeer.dominion.uis.tuis.dominion.manage.EnvSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting; import cn.lunadeer.dominion.uis.tuis.dominion.manage.GuestSetting;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -3,9 +3,9 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.GroupController; import cn.lunadeer.dominion.controllers.GroupController;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupList; import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupList;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupSetting; import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.group.SelectMember; import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.SelectMember;
import cn.lunadeer.minecraftpluginutils.ColorParser; import cn.lunadeer.minecraftpluginutils.ColorParser;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -44,7 +44,7 @@ public class Helper {
if (dominion == null) return groups_name; if (dominion == null) return groups_name;
List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId()); List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId());
for (GroupDTO group : groups) { for (GroupDTO group : groups) {
groups_name.add(group.getName()); groups_name.add(group.getNamePlain());
} }
return groups_name; return groups_name;
} }

View File

@ -3,10 +3,10 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.MemberController; import cn.lunadeer.dominion.controllers.MemberController;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberList; import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.MemberList;
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberSetting; import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.MemberSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectPlayer; import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.SelectPlayer;
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectTemplate; import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.SelectTemplate;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

View File

@ -6,7 +6,7 @@ import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.MigrateList; import cn.lunadeer.dominion.uis.tuis.MigrateList;
import cn.lunadeer.dominion.utils.ResMigration; import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -2,7 +2,8 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.api.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.DatabaseTables;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.map.MapRender; import cn.lunadeer.dominion.utils.map.MapRender;
import cn.lunadeer.minecraftpluginutils.GiteaReleaseCheck; import cn.lunadeer.minecraftpluginutils.GiteaReleaseCheck;
@ -52,7 +53,7 @@ public class Operator {
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
Notification.info(sender, Translation.Commands_Operator_ExportingMCAList); Notification.info(sender, Translation.Commands_Operator_ExportingMCAList);
Map<String, List<String>> mca_cords = new HashMap<>(); Map<String, List<String>> mca_cords = new HashMap<>();
List<DominionDTO> doms = Cache.instance.getDominions(); List<DominionDTO> doms = Cache.instance.getAllDominions();
for (DominionDTO dom : doms) { for (DominionDTO dom : doms) {
if (dom.getWorld() == null) { if (dom.getWorld() == null) {
continue; continue;
@ -140,6 +141,42 @@ public class Operator {
}); });
} }
/**
* 导出数据库
* /dominion export_db [confirm]
*
* @param sender 发送者
* @param args 参数
*/
public static void exportDatabase(CommandSender sender, String[] args) {
if (!hasPermission(sender, "dominion.admin")) {
return;
}
if (args.length != 2 || !args[1].equals("confirm")) {
Notification.warn(sender, Translation.Commands_Operator_ExportDBConfirm);
return;
}
DatabaseTables.Export(sender);
}
/**
* 导入数据库
* /dominion import_db [confirm]
*
* @param sender 发送者
* @param args 参数
*/
public static void importDatabase(CommandSender sender, String[] args) {
if (!hasPermission(sender, "dominion.admin")) {
return;
}
if (args.length != 2 || !args[1].equals("confirm")) {
Notification.warn(sender, Translation.Commands_Operator_ImportDBConfirm);
return;
}
DatabaseTables.Import(sender);
}
public static void version(CommandSender sender, String[] args) { public static void version(CommandSender sender, String[] args) {
if (!hasPermission(sender, "dominion.admin")) { if (!hasPermission(sender, "dominion.admin")) {
return; return;

View File

@ -1,280 +0,0 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.SysConfig;
import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender;
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
public class SetConfig {
public static void handler(CommandSender sender, String[] args) {
if (!hasPermission(sender, "dominion.admin")) {
return;
}
if (args.length < 2) {
Notification.error(sender, Translation.Commands_ArgumentsNotEnough);
return;
}
switch (args[1]) {
case "auto_create_radius":
setAutoCreateRadius(sender, args);
break;
case "limit_max_y":
setLimitMaxY(sender, args);
break;
case "limit_min_y":
setLimitMinY(sender, args);
break;
case "limit_size_x":
setLimitSizeX(sender, args);
break;
case "limit_size_z":
setLimitSizeZ(sender, args);
break;
case "limit_size_y":
setLimitSizeY(sender, args);
break;
case "limit_amount":
setLimitAmount(sender, args);
break;
case "limit_depth":
setLimitDepth(sender, args);
break;
case "limit_vert":
setLimitVert(sender, args);
break;
case "limit_op_bypass":
setLimitOpBypass(sender, args);
break;
case "tp_enable":
setTpEnable(sender, args);
break;
case "tp_delay":
setTpDelay(sender, args);
break;
case "tp_cool_down":
setTpCoolDown(sender, args);
break;
case "economy_enable":
setEconomyEnable(sender, args);
break;
case "economy_price":
setEconomyPrice(sender, args);
break;
case "economy_only_xz":
setEconomyOnlyXZ(sender, args);
break;
case "economy_refund":
setEconomyRefund(sender, args);
break;
case "residence_migration":
setResidenceMigration(sender, args);
break;
case "spawn_protection":
setSpawnProtection(sender, args);
break;
default:
Notification.error(sender, Translation.Commands_UnknownArgument);
}
}
public static void refreshPageOrNot(CommandSender sender, String[] args) {
if (args.length == 4) {
int page = Integer.parseInt(args[3]);
String[] newArgs = new String[2];
newArgs[0] = "config";
newArgs[1] = String.valueOf(page);
SysConfig.show(sender, newArgs);
}
}
private static void setAutoCreateRadius(CommandSender sender, String[] args) {
int size = Integer.parseInt(args[2]);
if (size <= 0) {
Dominion.config.setAutoCreateRadius(1);
Notification.error(sender, Translation.Config_Check_AutoCreateRadiusError);
} else {
Dominion.config.setAutoCreateRadius(size);
}
refreshPageOrNot(sender, args);
}
private static void adjustSizeY() {
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(null)) {
Notification.error(sender, Translation.Commands_SetConfig_MinYShouldBeLessThanMaxY);
return;
}
Dominion.config.setLimitMaxY(maxY);
adjustSizeY();
refreshPageOrNot(sender, args);
}
private static void setLimitMinY(CommandSender sender, String[] args) {
int minY = Integer.parseInt(args[2]);
if (minY >= Dominion.config.getLimitMaxY(null)) {
Notification.error(sender, Translation.Commands_SetConfig_MaxYShouldBeGreaterThanMinY);
return;
}
Dominion.config.setLimitMinY(minY);
adjustSizeY();
refreshPageOrNot(sender, args);
}
private static void setLimitSizeX(CommandSender sender, String[] args) {
int sizeX = Integer.parseInt(args[2]);
if (sizeX != -1 && sizeX < 4) {
Dominion.config.setLimitSizeX(4);
Notification.error(sender, Translation.Commands_SetConfig_SizeXShouldBeGreaterThan4);
} else {
Dominion.config.setLimitSizeX(sizeX);
}
refreshPageOrNot(sender, args);
}
private static void setLimitSizeZ(CommandSender sender, String[] args) {
int sizeZ = Integer.parseInt(args[2]);
if (sizeZ != -1 && sizeZ < 4) {
Dominion.config.setLimitSizeZ(4);
Notification.error(sender, Translation.Commands_SetConfig_SizeZShouldBeGreaterThan4);
return;
} else {
Dominion.config.setLimitSizeZ(sizeZ);
}
refreshPageOrNot(sender, args);
}
private static void setLimitSizeY(CommandSender sender, String[] args) {
int sizeY = Integer.parseInt(args[2]);
if (sizeY != -1 && sizeY < 4) {
Dominion.config.setLimitSizeY(4);
Notification.error(sender, Translation.Commands_SetConfig_SizeYShouldBeGreaterThan4);
} else {
Dominion.config.setLimitSizeY(sizeY);
}
refreshPageOrNot(sender, args);
}
private static void setLimitAmount(CommandSender sender, String[] args) {
int amount = Integer.parseInt(args[2]);
if (amount != -1 && amount < 0) {
Dominion.config.setLimitAmount(0);
Notification.error(sender, Translation.Commands_SetConfig_AmountShouldBeGreaterThan0);
} else {
Dominion.config.setLimitAmount(amount);
}
refreshPageOrNot(sender, args);
}
private static void setLimitDepth(CommandSender sender, String[] args) {
int depth = Integer.parseInt(args[2]);
if (depth != -1 && depth < 0) {
Dominion.config.setLimitDepth(0);
Notification.error(sender, Translation.Commands_SetConfig_DepthShouldBeGreaterThan0);
} else {
Dominion.config.setLimitDepth(depth);
}
refreshPageOrNot(sender, args);
}
private static void setLimitVert(CommandSender sender, String[] args) {
boolean limitVert = Boolean.parseBoolean(args[2]);
Dominion.config.setLimitVert(limitVert);
adjustSizeY();
refreshPageOrNot(sender, args);
}
private static void setLimitOpBypass(CommandSender sender, String[] args) {
boolean limitOpBypass = Boolean.parseBoolean(args[2]);
Dominion.config.setLimitOpBypass(limitOpBypass);
refreshPageOrNot(sender, args);
}
private static void setTpEnable(CommandSender sender, String[] args) {
boolean tpEnable = Boolean.parseBoolean(args[2]);
Dominion.config.setTpEnable(tpEnable);
refreshPageOrNot(sender, args);
}
private static void setTpDelay(CommandSender sender, String[] args) {
int tpDelay = Integer.parseInt(args[2]);
if (tpDelay < 0) {
Dominion.config.setTpDelay(0);
Notification.error(sender, Translation.Commands_SetConfig_TpDelayShouldBeGreaterThan0);
} else {
Dominion.config.setTpDelay(tpDelay);
}
refreshPageOrNot(sender, args);
}
private static void setTpCoolDown(CommandSender sender, String[] args) {
int tpCoolDown = Integer.parseInt(args[2]);
if (tpCoolDown < 0) {
Dominion.config.setTpCoolDown(0);
Notification.error(sender, Translation.Commands_SetConfig_TpCoolDownShouldBeGreaterThan0);
} else {
Dominion.config.setTpCoolDown(tpCoolDown);
}
refreshPageOrNot(sender, args);
}
private static void setEconomyEnable(CommandSender sender, String[] args) {
boolean economyEnable = Boolean.parseBoolean(args[2]);
Dominion.config.setEconomyEnable(economyEnable);
refreshPageOrNot(sender, args);
}
private static void setEconomyPrice(CommandSender sender, String[] args) {
float economyPrice = Float.parseFloat(args[2]);
if (economyPrice < 0) {
Dominion.config.setEconomyPrice(0.0f);
Notification.error(sender, Translation.Commands_SetConfig_PriceShouldBeGreaterThan0);
} else {
Dominion.config.setEconomyPrice(economyPrice);
}
refreshPageOrNot(sender, args);
}
private static void setEconomyOnlyXZ(CommandSender sender, String[] args) {
boolean economyOnlyXZ = Boolean.parseBoolean(args[2]);
Dominion.config.setEconomyOnlyXZ(economyOnlyXZ);
refreshPageOrNot(sender, args);
}
private static void setEconomyRefund(CommandSender sender, String[] args) {
float economyRefund = Float.parseFloat(args[2]);
if (economyRefund < 0) {
Dominion.config.setEconomyRefund(0.0f);
Notification.error(sender, Translation.Commands_SetConfig_RefundShouldBeGreaterThan0);
} else {
Dominion.config.setEconomyRefund(economyRefund);
}
refreshPageOrNot(sender, args);
}
private static void setResidenceMigration(CommandSender sender, String[] args) {
boolean residenceMigration = Boolean.parseBoolean(args[2]);
Dominion.config.setResidenceMigration(residenceMigration);
refreshPageOrNot(sender, args);
}
private static void setSpawnProtection(CommandSender sender, String[] args) {
int spawnProtection = Integer.parseInt(args[2]);
if (spawnProtection != -1 && spawnProtection <= 0) {
Dominion.config.setSpawnProtection(1);
Notification.error(sender, Translation.Commands_SetConfig_SpawnProtectRadiusShouldBeGreaterThan0);
} else {
Dominion.config.setSpawnProtection(spawnProtection);
}
refreshPageOrNot(sender, args);
}
}

View File

@ -3,8 +3,8 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController; import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.template.TemplateList; import cn.lunadeer.dominion.uis.tuis.template.TemplateList;
import cn.lunadeer.dominion.tuis.template.TemplateSetting; import cn.lunadeer.dominion.uis.tuis.template.TemplateSetting;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -6,7 +6,7 @@ import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.TitleList; import cn.lunadeer.dominion.uis.tuis.TitleList;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -43,7 +43,7 @@ public class Title {
} }
DominionDTO dominion = Cache.instance.getDominion(group.getDomID()); DominionDTO dominion = Cache.instance.getDominion(group.getDomID());
if (dominion == null) { if (dominion == null) {
Notification.error(sender, Translation.Commands_Title_GroupDominionNotExist, group.getName()); Notification.error(sender, Translation.Commands_Title_GroupDominionNotExist, group.getNamePlain());
return; return;
} }
if (!dominion.getOwner().equals(bukkit_player.getUniqueId())) { if (!dominion.getOwner().equals(bukkit_player.getUniqueId())) {
@ -53,12 +53,12 @@ public class Title {
return; return;
} }
if (!Objects.equals(member.getGroupId(), group.getId())) { if (!Objects.equals(member.getGroupId(), group.getId())) {
Notification.error(sender, Translation.Commands_Title_NotGroupMember, group.getName()); Notification.error(sender, Translation.Commands_Title_NotGroupMember, group.getNamePlain());
return; return;
} }
} }
player.setUsingGroupTitleID(group.getId()); player.setUsingGroupTitleID(group.getId());
Notification.info(sender, Translation.Commands_Title_UseTitleSuccess, group.getName()); Notification.info(sender, Translation.Commands_Title_UseTitleSuccess, group.getNamePlain());
} }
int page = getPage(args, 2); int page = getPage(args, 2);
TitleList.show(sender, page); TitleList.show(sender, page);

View File

@ -24,7 +24,7 @@ public interface AbstractOperator {
public Result(Integer success, i18n message, Object... args) { public Result(Integer success, i18n message, Object... args) {
this.success = success; this.success = success;
this.messages = new ArrayList<>(); this.messages = new ArrayList<>();
this.messages.add(message.trans()); this.messages.add(String.format(message.trans(), args));
} }
public Result(Integer success, String message, Object... args) { public Result(Integer success, String message, Object... args) {

View File

@ -103,6 +103,14 @@ public class DominionController {
operator.setResponse(FAIL.addMessage(Translation.Messages_SelectPointsWorldNotSame)); operator.setResponse(FAIL.addMessage(Translation.Messages_SelectPointsWorldNotSame));
return; return;
} }
if (operator.getLocation() == null) {
operator.setResponse(FAIL.addMessage(Translation.Messages_CommandPlayerOnly));
return;
}
if (!loc1.getWorld().getUID().equals(operator.getLocation().getWorld().getUID())) {
operator.setResponse(FAIL.addMessage(Translation.Messages_CrossWorldOperationDisallowed));
return;
}
// 检查世界是否可以创建 // 检查世界是否可以创建
if (worldNotValid(operator, loc1.getWorld().getName())) { if (worldNotValid(operator, loc1.getWorld().getName())) {
operator.setResponse(FAIL.addMessage(Translation.Messages_CreateDominionDisabledWorld, loc1.getWorld().getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_CreateDominionDisabledWorld, loc1.getWorld().getName()));
@ -719,20 +727,28 @@ public class DominionController {
int x_length = x2 - x1; int x_length = x2 - x1;
int y_length = y2 - y1; int y_length = y2 - y1;
int z_length = z2 - z1; int z_length = z2 - z1;
if (x_length < 4 || y_length < 4 || z_length < 4) { if (x_length < Dominion.config.getLimitSizeMinX(operator.getPlayer())) {
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeShouldBeGreaterThan4)); operator.setResponse(FAIL.addMessage(Translation.Messages_SizeXShouldBeGreaterThan, Dominion.config.getLimitSizeMinX(operator.getPlayer())));
return true; return true;
} }
if (x_length > Dominion.config.getLimitSizeX(operator.getPlayer()) && Dominion.config.getLimitSizeX(operator.getPlayer()) > 0) { if (y_length < Dominion.config.getLimitSizeMinY(operator.getPlayer())) {
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeXShouldBeLessThan, Dominion.config.getLimitSizeX(operator.getPlayer()))); operator.setResponse(FAIL.addMessage(Translation.Messages_SizeYShouldBeGreaterThan, Dominion.config.getLimitSizeMinY(operator.getPlayer())));
return true; return true;
} }
if (y_length > Dominion.config.getLimitSizeY(operator.getPlayer()) && Dominion.config.getLimitSizeY(operator.getPlayer()) > 0) { if (z_length < Dominion.config.getLimitSizeMinZ(operator.getPlayer())) {
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeYShouldBeLessThan, Dominion.config.getLimitSizeY(operator.getPlayer()))); operator.setResponse(FAIL.addMessage(Translation.Messages_SizeZShouldBeGreaterThan, Dominion.config.getLimitSizeMinZ(operator.getPlayer())));
return true; return true;
} }
if (z_length > Dominion.config.getLimitSizeZ(operator.getPlayer()) && Dominion.config.getLimitSizeZ(operator.getPlayer()) > 0) { if (x_length > Dominion.config.getLimitSizeMaxX(operator.getPlayer()) && Dominion.config.getLimitSizeMaxX(operator.getPlayer()) > 0) {
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeZShouldBeLessThan, Dominion.config.getLimitSizeZ(operator.getPlayer()))); operator.setResponse(FAIL.addMessage(Translation.Messages_SizeXShouldBeLessThan, Dominion.config.getLimitSizeMaxX(operator.getPlayer())));
return true;
}
if (y_length > Dominion.config.getLimitSizeMaxY(operator.getPlayer()) && Dominion.config.getLimitSizeMaxY(operator.getPlayer()) > 0) {
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeYShouldBeLessThan, Dominion.config.getLimitSizeMaxY(operator.getPlayer())));
return true;
}
if (z_length > Dominion.config.getLimitSizeMaxZ(operator.getPlayer()) && Dominion.config.getLimitSizeMaxZ(operator.getPlayer()) > 0) {
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeZShouldBeLessThan, Dominion.config.getLimitSizeMaxZ(operator.getPlayer())));
return true; return true;
} }
if (y2 > Dominion.config.getLimitMaxY(operator.getPlayer())) { if (y2 > Dominion.config.getLimitMaxY(operator.getPlayer())) {

View File

@ -71,7 +71,7 @@ public class MemberController {
} }
GroupDTO group = GroupDTO.select(privilege.getGroupId()); GroupDTO group = GroupDTO.select(privilege.getGroupId());
if (group != null) { if (group != null) {
operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerBelongToGroup, player_name, group.getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerBelongToGroup, player_name, group.getNamePlain()));
return; return;
} }
if ((flag.equals("admin") || isAdmin(privilege)) && notOwner(operator, dominion)) { if ((flag.equals("admin") || isAdmin(privilege)) && notOwner(operator, dominion)) {

View File

@ -2,6 +2,7 @@ package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.api.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field; import cn.lunadeer.minecraftpluginutils.databse.Field;
@ -10,6 +11,7 @@ import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -17,13 +19,13 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
public class DominionDTO { public class DominionDTO implements cn.lunadeer.dominion.api.dtos.DominionDTO {
private static List<DominionDTO> query(String sql, Object... args) { private static List<DominionDTO> query(String sql, Object... args) {
List<DominionDTO> dominions = new ArrayList<>(); List<DominionDTO> dominions = new ArrayList<>();
try (ResultSet rs = DatabaseManager.instance.query(sql, args)) { try (ResultSet rs = DatabaseManager.instance.query(sql, args)) {
return getDTOFromRS(rs); return getDTOFromRS(rs);
} catch (SQLException e) { } catch (SQLException e) {
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, sql); DatabaseManager.handleDatabaseError("DominionDTO.query ", e, sql);
} }
return dominions; return dominions;
} }
@ -45,7 +47,7 @@ public class DominionDTO {
Integer parentDomId = rs.getInt("parent_dom_id"); Integer parentDomId = rs.getInt("parent_dom_id");
String tp_location = rs.getString("tp_location"); String tp_location = rs.getString("tp_location");
Map<Flag, Boolean> flags = new HashMap<>(); Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getDominionFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getDominionFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName())); flags.put(f, rs.getBoolean(f.getFlagName()));
} }
String color = rs.getString("color"); String color = rs.getString("color");
@ -88,7 +90,7 @@ public class DominionDTO {
String sql = "SELECT * FROM dominion WHERE id = ? AND id > 0;"; String sql = "SELECT * FROM dominion WHERE id = ? AND id > 0;";
List<DominionDTO> dominions = query(sql, id); List<DominionDTO> dominions = query(sql, id);
if (dominions.isEmpty()) return null; if (dominions.isEmpty()) return null;
return dominions.getFirst(); return dominions.get(0);
} }
public static List<DominionDTO> selectByParentId(World world, Integer parentId) { public static List<DominionDTO> selectByParentId(World world, Integer parentId) {
@ -112,7 +114,7 @@ public class DominionDTO {
String sql = "SELECT * FROM dominion WHERE name = ? AND id > 0;"; String sql = "SELECT * FROM dominion WHERE name = ? AND id > 0;";
List<DominionDTO> dominions = query(sql, name); List<DominionDTO> dominions = query(sql, name);
if (dominions.isEmpty()) return null; if (dominions.isEmpty()) return null;
return dominions.getFirst(); return dominions.get(0);
} }
public static DominionDTO insert(DominionDTO dominion) { public static DominionDTO insert(DominionDTO dominion) {
@ -125,16 +127,16 @@ public class DominionDTO {
.field(dominion.parentDomId) .field(dominion.parentDomId)
.field(dominion.joinMessage).field(dominion.leaveMessage) .field(dominion.joinMessage).field(dominion.leaveMessage)
.field(dominion.tp_location); .field(dominion.tp_location);
for (Flag f : Flag.getDominionFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getDominionFlagsEnabled()) {
insert.field(new Field(f.getFlagName(), f.getDefaultValue())); insert.field(new Field(f.getFlagName(), f.getDefaultValue()));
} }
try (ResultSet rs = insert.execute()) { try (ResultSet rs = insert.execute()) {
Cache.instance.loadDominions(); Cache.instance.loadDominions();
List<DominionDTO> dominions = getDTOFromRS(rs); List<DominionDTO> dominions = getDTOFromRS(rs);
if (dominions.isEmpty()) return null; if (dominions.isEmpty()) return null;
return dominions.getFirst(); return dominions.get(0);
} catch (SQLException e) { } catch (SQLException e) {
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString()); DatabaseManager.handleDatabaseError("DominionDTO.insert ", e, insert.toString());
return null; return null;
} }
} }
@ -185,6 +187,8 @@ public class DominionDTO {
this.y2.value = y2; this.y2.value = y2;
this.z2.value = z2; this.z2.value = z2;
this.parentDomId.value = parentDomId; this.parentDomId.value = parentDomId;
this.joinMessage.value = Dominion.config.getDefaultJoinMessage();
this.leaveMessage.value = Dominion.config.getDefaultLeaveMessage();
} }
public DominionDTO(UUID owner, String name, @NotNull World world, public DominionDTO(UUID owner, String name, @NotNull World world,
@ -207,8 +211,8 @@ public class DominionDTO {
private final Field y2 = new Field("y2", FieldType.INT); private final Field y2 = new Field("y2", FieldType.INT);
private final Field z2 = new Field("z2", FieldType.INT); private final Field z2 = new Field("z2", FieldType.INT);
private final Field parentDomId = new Field("parent_dom_id", -1); private final Field parentDomId = new Field("parent_dom_id", -1);
private final Field joinMessage = new Field("join_message", "欢迎来到 ${DOM_NAME}"); private final Field joinMessage = new Field("join_message", "");
private final Field leaveMessage = new Field("leave_message", "你正在离开 ${DOM_NAME},欢迎下次光临~"); private final Field leaveMessage = new Field("leave_message", "");
private final Map<Flag, Boolean> flags = new HashMap<>(); private final Map<Flag, Boolean> flags = new HashMap<>();
private final Field tp_location = new Field("tp_location", "default"); private final Field tp_location = new Field("tp_location", "default");
private final Field color = new Field("color", "#00BFFF"); private final Field color = new Field("color", "#00BFFF");
@ -216,11 +220,13 @@ public class DominionDTO {
// getters and setters // getters and setters
public Integer getId() { @Override
public @NotNull Integer getId() {
return (Integer) id.value; return (Integer) id.value;
} }
public UUID getOwner() { @Override
public @NotNull UUID getOwner() {
return UUID.fromString((String) owner.value); return UUID.fromString((String) owner.value);
} }
@ -232,36 +238,48 @@ public class DominionDTO {
List<DominionDTO> dominions = getDTOFromRS(rs); List<DominionDTO> dominions = getDTOFromRS(rs);
if (dominions.isEmpty()) return null; if (dominions.isEmpty()) return null;
Cache.instance.loadDominions((Integer) id.value); Cache.instance.loadDominions((Integer) id.value);
return dominions.getFirst(); return dominions.get(0);
} catch (SQLException e) { } catch (SQLException e) {
DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString()); DatabaseManager.handleDatabaseError("DominionDTO.doUpdate ", e, updateRow.toString());
return null; return null;
} }
} }
@Override
public DominionDTO setOwner(UUID owner) { public DominionDTO setOwner(UUID owner) {
this.owner.value = owner.toString(); this.owner.value = owner.toString();
return doUpdate(new UpdateRow().field(this.owner)); return doUpdate(new UpdateRow().field(this.owner));
} }
public String getName() { @Override
public DominionDTO setOwner(Player owner) {
this.owner.value = owner.getUniqueId().toString();
return doUpdate(new UpdateRow().field(this.owner));
}
@Override
public @NotNull String getName() {
return (String) name.value; return (String) name.value;
} }
@Override
public DominionDTO setName(String name) { public DominionDTO setName(String name) {
this.name.value = name; this.name.value = name;
return doUpdate(new UpdateRow().field(this.name)); return doUpdate(new UpdateRow().field(this.name));
} }
@Override
public @Nullable World getWorld() { public @Nullable World getWorld() {
return Dominion.instance.getServer().getWorld(getWorldUid()); return Dominion.instance.getServer().getWorld(getWorldUid());
} }
public UUID getWorldUid() { @Override
public @NotNull UUID getWorldUid() {
return UUID.fromString((String) world_uid.value); return UUID.fromString((String) world_uid.value);
} }
public Integer getX1() { @Override
public @NotNull Integer getX1() {
return (Integer) x1.value; return (Integer) x1.value;
} }
@ -270,7 +288,8 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(this.x1)); return doUpdate(new UpdateRow().field(this.x1));
} }
public Integer getY1() { @Override
public @NotNull Integer getY1() {
return (Integer) y1.value; return (Integer) y1.value;
} }
@ -279,7 +298,8 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(this.y1)); return doUpdate(new UpdateRow().field(this.y1));
} }
public Integer getZ1() { @Override
public @NotNull Integer getZ1() {
return (Integer) z1.value; return (Integer) z1.value;
} }
@ -288,7 +308,8 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(this.z1)); return doUpdate(new UpdateRow().field(this.z1));
} }
public Integer getX2() { @Override
public @NotNull Integer getX2() {
return (Integer) x2.value; return (Integer) x2.value;
} }
@ -297,7 +318,8 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(this.x2)); return doUpdate(new UpdateRow().field(this.x2));
} }
public Integer getY2() { @Override
public @NotNull Integer getY2() {
return (Integer) y2.value; return (Integer) y2.value;
} }
@ -306,7 +328,8 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(this.y2)); return doUpdate(new UpdateRow().field(this.y2));
} }
public Integer getZ2() { @Override
public @NotNull Integer getZ2() {
return (Integer) z2.value; return (Integer) z2.value;
} }
@ -315,43 +338,53 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(this.z2)); return doUpdate(new UpdateRow().field(this.z2));
} }
public Integer getSquare() { @Override
public @NotNull Integer getSquare() {
return getWidthX() * getWidthZ(); return getWidthX() * getWidthZ();
} }
public Integer getVolume() { @Override
public @NotNull Integer getVolume() {
return getSquare() * getHeight(); return getSquare() * getHeight();
} }
public Integer getWidthX() { @Override
public @NotNull Integer getWidthX() {
return getX2() - getX1(); return getX2() - getX1();
} }
public Integer getHeight() { @Override
public @NotNull Integer getHeight() {
return getY2() - getY1(); return getY2() - getY1();
} }
public Integer getWidthZ() { @Override
public @NotNull Integer getWidthZ() {
return getZ2() - getZ1(); return getZ2() - getZ1();
} }
public Integer getParentDomId() { @Override
public @NotNull Integer getParentDomId() {
return (Integer) parentDomId.value; return (Integer) parentDomId.value;
} }
public String getJoinMessage() { @Override
public @NotNull String getJoinMessage() {
return (String) joinMessage.value; return (String) joinMessage.value;
} }
@Override
public DominionDTO setJoinMessage(String joinMessage) { public DominionDTO setJoinMessage(String joinMessage) {
this.joinMessage.value = joinMessage; this.joinMessage.value = joinMessage;
return doUpdate(new UpdateRow().field(this.joinMessage)); return doUpdate(new UpdateRow().field(this.joinMessage));
} }
public String getLeaveMessage() { @Override
public @NotNull String getLeaveMessage() {
return (String) leaveMessage.value; return (String) leaveMessage.value;
} }
@Override
public DominionDTO setLeaveMessage(String leaveMessage) { public DominionDTO setLeaveMessage(String leaveMessage) {
this.leaveMessage.value = leaveMessage; this.leaveMessage.value = leaveMessage;
return doUpdate(new UpdateRow().field(this.leaveMessage)); return doUpdate(new UpdateRow().field(this.leaveMessage));
@ -362,12 +395,28 @@ public class DominionDTO {
return flags.get(flag); return flags.get(flag);
} }
public DominionDTO setFlagValue(Flag flag, Boolean value) { @Override
public @NotNull Map<Flag, Boolean> getEnvironmentFlagValue() {
return flags.entrySet().stream()
.filter(e -> e.getKey().isEnvironmentFlag())
.collect(HashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), HashMap::putAll);
}
@Override
public @NotNull Map<Flag, Boolean> getGuestPrivilegeFlagValue() {
return flags.entrySet().stream()
.filter(e -> !e.getKey().isEnvironmentFlag())
.collect(HashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), HashMap::putAll);
}
@Override
public DominionDTO setFlagValue(@NotNull Flag flag, @NotNull Boolean value) {
flags.put(flag, value); flags.put(flag, value);
Field flagField = new Field(flag.getFlagName(), value); Field flagField = new Field(flag.getFlagName(), value);
return doUpdate(new UpdateRow().field(flagField)); return doUpdate(new UpdateRow().field(flagField));
} }
@Override
public DominionDTO setXYZ(Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2) { public DominionDTO setXYZ(Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2) {
this.x1.value = x1; this.x1.value = x1;
this.y1.value = y1; this.y1.value = y1;
@ -375,9 +424,25 @@ public class DominionDTO {
this.x2.value = x2; this.x2.value = x2;
this.y2.value = y2; this.y2.value = y2;
this.z2.value = z2; this.z2.value = z2;
if (x1 > x2) {
int tmp = x1;
this.x1.value = x2;
this.x2.value = tmp;
}
if (y1 > y2) {
int tmp = y1;
this.y1.value = y2;
this.y2.value = tmp;
}
if (z1 > z2) {
int tmp = z1;
this.z1.value = z2;
this.z2.value = tmp;
}
return doUpdate(new UpdateRow().field(this.x1).field(this.y1).field(this.z1).field(this.x2).field(this.y2).field(this.z2)); return doUpdate(new UpdateRow().field(this.x1).field(this.y1).field(this.z1).field(this.x2).field(this.y2).field(this.z2));
} }
@Override
public DominionDTO setXYZ(int[] cords) { public DominionDTO setXYZ(int[] cords) {
if (cords.length == 6) { if (cords.length == 6) {
return setXYZ(cords[0], cords[1], cords[2], cords[3], cords[4], cords[5]); return setXYZ(cords[0], cords[1], cords[2], cords[3], cords[4], cords[5]);
@ -388,6 +453,7 @@ public class DominionDTO {
} }
@Override
public Location getTpLocation() { public Location getTpLocation() {
if (Objects.equals(tp_location.value, "default")) { if (Objects.equals(tp_location.value, "default")) {
return null; return null;
@ -410,11 +476,13 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(tp_location)); return doUpdate(new UpdateRow().field(tp_location));
} }
public Location getLocation1() { @Override
public @NotNull Location getLocation1() {
return new Location(getWorld(), getX1(), getY1(), getZ1()); return new Location(getWorld(), getX1(), getY1(), getZ1());
} }
public Location getLocation2() { @Override
public @NotNull Location getLocation2() {
return new Location(getWorld(), getX2(), getY2(), getZ2()); return new Location(getWorld(), getX2(), getY2(), getZ2());
} }
@ -423,22 +491,27 @@ public class DominionDTO {
return doUpdate(new UpdateRow().field(this.color)); return doUpdate(new UpdateRow().field(this.color));
} }
@Override
public int getColorR() { public int getColorR() {
return Integer.valueOf(getColor().substring(1, 3), 16); return Integer.valueOf(getColor().substring(1, 3), 16);
} }
@Override
public int getColorG() { public int getColorG() {
return Integer.valueOf(getColor().substring(3, 5), 16); return Integer.valueOf(getColor().substring(3, 5), 16);
} }
@Override
public int getColorB() { public int getColorB() {
return Integer.valueOf(getColor().substring(5, 7), 16); return Integer.valueOf(getColor().substring(5, 7), 16);
} }
public String getColor() { @Override
public @NotNull String getColor() {
return (String) color.value; return (String) color.value;
} }
@Override
public int getColorHex() { public int getColorHex() {
return (getColorR() << 16) + (getColorG() << 8) + getColorB(); return (getColorR() << 16) + (getColorG() << 8) + getColorB();
} }

View File

@ -1,18 +1,20 @@
package cn.lunadeer.dominion.dtos; package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.JsonFile; import cn.lunadeer.minecraftpluginutils.JsonFile;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.i18n.Localization;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.text.Collator; import java.text.Collator;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public enum Flag { public enum Flag implements cn.lunadeer.dominion.api.dtos.Flag {
ANCHOR("anchor", "重生锚", "是否允许设置/使用重生锚", false, false, true), ANCHOR("anchor", "重生锚", "是否允许设置/使用重生锚", false, false, true),
ANIMAL_KILLING("animal_killing", "对动物造成伤害", "是否允许对动物造成伤害", false, false, true), ANIMAL_KILLING("animal_killing", "对动物造成伤害", "是否允许对动物造成伤害", false, false, true),
ANIMAL_SPAWN("animal_spawn", "动物生成(繁殖)", "是否允许动物生成(包括繁殖)", true, true, false), ANIMAL_SPAWN("animal_spawn", "动物生成(繁殖)", "是否允许动物生成(包括繁殖)", true, true, false),
@ -43,6 +45,7 @@ public enum Flag {
FLOW_IN_PROTECTION("flow_in_protection", "外部流体是否可以进入", "包含:岩浆、水(不会阻止领地内部的流体蔓延)", false, true, true), FLOW_IN_PROTECTION("flow_in_protection", "外部流体是否可以进入", "包含:岩浆、水(不会阻止领地内部的流体蔓延)", false, true, true),
FLY("fly", "飞行", "不是翅鞘飞行,是类似于创造模式的飞行", false, false, false), FLY("fly", "飞行", "不是翅鞘飞行,是类似于创造模式的飞行", false, false, false),
GLOW("glow", "玩家发光", "类似光灵箭的高亮效果", false, false, true), GLOW("glow", "玩家发光", "类似光灵箭的高亮效果", false, false, true),
GRAVITY_BLOCK("gravity_block", "允许外部重力方块落入", "如果禁止则领地外重力方块进入领地会变为掉落物", false, true, true),
HARVEST("harvest", "收获", "收获庄稼、作物", false, false, true), HARVEST("harvest", "收获", "收获庄稼、作物", false, false, true),
HONEY("honey", "蜂巢交互", "是否可以采蜂蜜", false, false, true), HONEY("honey", "蜂巢交互", "是否可以采蜂蜜", false, false, true),
HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true), HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true),
@ -85,7 +88,6 @@ public enum Flag {
private Boolean default_value; private Boolean default_value;
private Boolean enable; private Boolean enable;
private final Boolean dominion_only; private final Boolean dominion_only;
private Boolean custom_text = false;
private final String default_display_name; private final String default_display_name;
private final String default_description; private final String default_description;
@ -100,26 +102,36 @@ public enum Flag {
this.enable = enable; this.enable = enable;
} }
public String getFlagName() { @Override
public @NotNull String getFlagName() {
return flag_name; return flag_name;
} }
public String getDisplayName() { @Override
public @NotNull String getDisplayName() {
return display_name; return display_name;
} }
public String getDescription() { @Override
public @NotNull String getDescription() {
return description; return description;
} }
public Boolean getDefaultValue() { @Override
public @NotNull Boolean getDefaultValue() {
return default_value; return default_value;
} }
public Boolean getEnable() { @Override
public @NotNull Boolean getEnable() {
return enable; return enable;
} }
@Override
public @NotNull Boolean isEnvironmentFlag() {
return dominion_only;
}
public void setDisplayName(String displayName) { public void setDisplayName(String displayName) {
this.display_name = displayName; this.display_name = displayName;
} }
@ -136,30 +148,18 @@ public enum Flag {
this.enable = enable; this.enable = enable;
} }
public String getDisplayNameKey() {
return "Flags." + flag_name + ".DisplayName";
}
public String getDescriptionKey() {
return "Flags." + flag_name + ".Description";
}
public static List<Flag> getAllFlags() { public static List<Flag> getAllFlags() {
return Arrays.asList(Flag.values()); return Arrays.asList(Flag.values());
} }
public static List<Flag> getDominionOnlyFlagsEnabled() {
List<Flag> flags = new ArrayList<>();
for (Flag flag : Flag.values()) {
if (!flag.dominion_only) {
continue;
}
if (!flag.enable) {
continue;
}
flags.add(flag);
}
Comparator<Object> comparator = Collator.getInstance(java.util.Locale.CHINA);
flags.sort((o1, o2) -> comparator.compare(o1.getDisplayName(), o2.getDisplayName()));
return flags;
}
public static boolean isDominionOnlyFlag(String flagName) {
return getFlag(flagName).dominion_only;
}
public static List<Flag> getDominionFlagsEnabled() { public static List<Flag> getDominionFlagsEnabled() {
List<Flag> flags = new ArrayList<>(); List<Flag> flags = new ArrayList<>();
for (Flag flag : Flag.values()) { for (Flag flag : Flag.values()) {
@ -173,10 +173,25 @@ public enum Flag {
return flags; return flags;
} }
public static List<Flag> getAllDominionFlags() { public static boolean isDominionOnlyFlag(String flagName) {
return new ArrayList<>(Arrays.asList(Flag.values())); return getFlag(flagName).dominion_only;
} }
public static List<Flag> getEnvironmentFlagsEnabled() {
List<Flag> flags = new ArrayList<>();
for (Flag flag : Flag.values()) {
if (!flag.dominion_only) {
continue;
}
if (!flag.enable) {
continue;
}
flags.add(flag);
}
Comparator<Object> comparator = Collator.getInstance(java.util.Locale.CHINA);
flags.sort((o1, o2) -> comparator.compare(o1.getDisplayName(), o2.getDisplayName()));
return flags;
}
public static List<Flag> getPrivilegeFlagsEnabled() { public static List<Flag> getPrivilegeFlagsEnabled() {
List<Flag> flags = new ArrayList<>(); List<Flag> flags = new ArrayList<>();
@ -194,6 +209,10 @@ public enum Flag {
return flags; return flags;
} }
public static List<Flag> getAllDominionFlags() {
return new ArrayList<>(Arrays.asList(Flag.values()));
}
public static List<Flag> getAllPrivilegeFlags() { public static List<Flag> getAllPrivilegeFlags() {
List<Flag> flags = new ArrayList<>(); List<Flag> flags = new ArrayList<>();
for (Flag flag : Flag.values()) { for (Flag flag : Flag.values()) {
@ -209,84 +228,77 @@ public enum Flag {
return Arrays.stream(Flag.values()).filter(flag -> flag.getFlagName().equals(flagName)).findFirst().orElse(null); return Arrays.stream(Flag.values()).filter(flag -> flag.getFlagName().equals(flagName)).findFirst().orElse(null);
} }
/* /**
{ * 从文件中加载Flag配置
flag_name: { */
display_name: "", public static void loadFromFile() {
description: "", try {
default_value: true, loadLegacyJsonFlags();
enable: true loadFlagsConfiguration();
} } catch (Exception e) {
} XLogger.err(Translation.Config_Check_LoadFlagError, e.getMessage());
*/
public static JSONObject serializeToJson(Flag flag) {
JSONObject json = new JSONObject();
json.put("display_name", flag.getDisplayName());
json.put("description", flag.getDescription());
json.put("default_value", flag.getDefaultValue());
json.put("enable", flag.getEnable());
json.put("custom_text", flag.custom_text);
return json;
}
public static JSONObject serializeToJson() {
JSONObject json = new JSONObject();
for (Flag flag : getAllFlags()) {
JSONObject flagJson = serializeToJson(flag);
json.put(flag.getFlagName(), flagJson);
} }
return json;
} }
private static void loadLegacyJsonFlags() throws Exception {
File jsonFile = new File(Dominion.instance.getDataFolder(), "flags.json");
if (jsonFile.exists()) {
JSONObject jsonObject = JsonFile.loadFromFile(jsonFile);
if (jsonObject != null) {
deserializeFromJson(jsonObject);
}
jsonFile.delete();
}
}
private static void loadFlagsConfiguration() throws IOException {
File yamlFile = new File(Dominion.instance.getDataFolder(), "flags.yml");
if (!yamlFile.exists()) {
Dominion.instance.saveResource("flags.yml", false);
}
YamlConfiguration yaml = YamlConfiguration.loadConfiguration(yamlFile);
for (Flag flag : getAllFlags()) {
// load flags name & description translations
((Translation)(Localization.instance)).loadOrSetFlagTranslation(flag);
// load flags default value & enable
String defaultValueKey;
String enableKey;
String descriptionKey;
if (flag.dominion_only) {
descriptionKey = "environment." + flag.getFlagName();
defaultValueKey = "environment." + flag.getFlagName() + ".default";
enableKey = "environment." + flag.getFlagName() + ".enable";
} else {
descriptionKey = "privilege." + flag.getFlagName();
defaultValueKey = "privilege." + flag.getFlagName() + ".default";
enableKey = "privilege." + flag.getFlagName() + ".enable";
}
if (yaml.contains(defaultValueKey)) {
flag.setDefaultValue(yaml.getBoolean(defaultValueKey));
} else {
yaml.set(defaultValueKey, flag.getDefaultValue());
}
if (yaml.contains(enableKey)) {
flag.setEnable(yaml.getBoolean(enableKey));
} else {
yaml.set(enableKey, flag.getEnable());
}
yaml.setInlineComments(descriptionKey, Collections.singletonList(flag.getDisplayName() + "-" + flag.getDescription()));
}
yaml.save(yamlFile);
}
@Deprecated
public static void deserializeFromJson(JSONObject jsonObject) { public static void deserializeFromJson(JSONObject jsonObject) {
for (Flag flag : getAllFlags()) { for (Flag flag : getAllFlags()) {
try { try {
JSONObject flagJson = (JSONObject) jsonObject.get(flag.getFlagName()); JSONObject flagJson = (JSONObject) jsonObject.get(flag.getFlagName());
if (flagJson != null) { if (flagJson != null) {
flag.custom_text = (Boolean) flagJson.getOrDefault("custom_text", false);
flag.setDefaultValue((Boolean) flagJson.getOrDefault("default_value", flag.getDefaultValue())); flag.setDefaultValue((Boolean) flagJson.getOrDefault("default_value", flag.getDefaultValue()));
flag.setEnable((Boolean) flagJson.getOrDefault("enable", flag.getEnable())); flag.setEnable((Boolean) flagJson.getOrDefault("enable", flag.getEnable()));
if (flag.custom_text) { // 如果使用自定义文本 则从配置文件中读取
flag.setDisplayName((String) flagJson.getOrDefault("display_name", flag.getDisplayName()));
flag.setDescription((String) flagJson.getOrDefault("description", flag.getDescription()));
} else { // 否则设置为默认文本
flag.setDisplayName(flag.default_display_name);
flag.setDescription(flag.default_description);
}
} }
} catch (Exception e) { } catch (Exception ignored) {
XLogger.warn("读取权限 %s 配置失败:%s已跳过使用默认配置", flag.getFlagName(), e.getMessage());
} }
} }
} }
public static void loadFromJson() {
try {
File flagFile = new File(Dominion.instance.getDataFolder(), "flags.json");
if (!flagFile.exists()) {
saveToJson();
}
JSONObject jsonObject = JsonFile.loadFromFile(flagFile);
if (jsonObject == null) {
XLogger.warn("读取权限配置失败,已重置");
saveToJson();
}
deserializeFromJson(jsonObject);
saveToJson(); // 复写一遍确保文件中包含所有权限
} catch (Exception e) {
XLogger.err("读取权限配置失败:%s", e.getMessage());
}
}
public static void saveToJson() {
try {
JSONObject json = serializeToJson();
XLogger.debug("保存权限配置:%s", json.toJSONString());
File flagFile = new File(Dominion.instance.getDataFolder(), "flags.json");
JsonFile.saveToFile(json, flagFile);
} catch (Exception e) {
XLogger.err("保存权限配置失败:%s", e.getMessage());
}
}
} }

View File

@ -2,6 +2,7 @@ package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.api.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.ColorParser; import cn.lunadeer.minecraftpluginutils.ColorParser;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field; import cn.lunadeer.minecraftpluginutils.databse.Field;
@ -9,6 +10,8 @@ import cn.lunadeer.minecraftpluginutils.databse.FieldType;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
@ -16,69 +19,92 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public class GroupDTO { public class GroupDTO implements cn.lunadeer.dominion.api.dtos.GroupDTO {
Field id = new Field("id", FieldType.INT); Field id = new Field("id", FieldType.INT);
Field domID = new Field("dom_id", FieldType.INT); Field domID = new Field("dom_id", FieldType.INT);
Field name = new Field("name", FieldType.STRING); Field name_raw = new Field("name", FieldType.STRING);
Field admin = new Field("admin", FieldType.BOOLEAN); Field admin = new Field("admin", FieldType.BOOLEAN);
Field name_colored = new Field("name_colored", FieldType.STRING); Field name_color = new Field("name_colored", FieldType.STRING);
private final Map<Flag, Boolean> flags = new HashMap<>(); private final Map<Flag, Boolean> flags = new HashMap<>();
public Integer getId() { @Override
public @NotNull Integer getId() {
return (Integer) id.value; return (Integer) id.value;
} }
public Integer getDomID() { @Override
public @NotNull Integer getDomID() {
return (Integer) domID.value; return (Integer) domID.value;
} }
public String getName() { @Override
return (String) name.value; public @NotNull String getNameRaw() {
return (String) name_color.value;
} }
public Component getNameColoredComponent() { @Override
public @NotNull String getNamePlain() {
return (String) name_raw.value;
}
@Override
public @NotNull Component getNameColoredComponent() {
String with_pre_suf = "&#ffffff" + String with_pre_suf = "&#ffffff" +
Dominion.config.getGroupTitlePrefix() + Dominion.config.getGroupTitlePrefix() +
(String) name_colored.value + (String) name_color.value +
"&#ffffff" + "&#ffffff" +
Dominion.config.getGroupTitleSuffix(); Dominion.config.getGroupTitleSuffix();
return ColorParser.getComponentType(with_pre_suf); return ColorParser.getComponentType(with_pre_suf);
} }
public String getNameColoredBukkit() { @Override
public @NotNull String getNameColoredBukkit() {
String with_pre_suf = "&#ffffff" + String with_pre_suf = "&#ffffff" +
Dominion.config.getGroupTitlePrefix() + Dominion.config.getGroupTitlePrefix() +
(String) name_colored.value + (String) name_color.value +
"&#ffffff" + "&#ffffff" +
Dominion.config.getGroupTitleSuffix(); Dominion.config.getGroupTitleSuffix();
return ColorParser.getBukkitType(with_pre_suf); return ColorParser.getBukkitType(with_pre_suf);
} }
public Boolean getAdmin() { @Override
public @NotNull Boolean getAdmin() {
return (Boolean) admin.value; return (Boolean) admin.value;
} }
public Boolean getFlagValue(Flag flag) { @Override
public @NotNull Boolean getFlagValue(@NotNull Flag flag) {
if (!flags.containsKey(flag)) return flag.getDefaultValue(); if (!flags.containsKey(flag)) return flag.getDefaultValue();
return flags.get(flag); return flags.get(flag);
} }
public GroupDTO setName(String name) { @Override
this.name_colored.value = name; public @NotNull Map<Flag, Boolean> getFlagsValue() {
this.name.value = ColorParser.getPlainText(name); return flags;
UpdateRow updateRow = new UpdateRow().field(this.name).field(this.name_colored); }
@Override
public @Nullable GroupDTO setName(@NotNull String name) {
this.name_color.value = name;
this.name_raw.value = ColorParser.getPlainText(name);
UpdateRow updateRow = new UpdateRow().field(this.name_raw).field(this.name_color);
return doUpdate(updateRow); return doUpdate(updateRow);
} }
public GroupDTO setAdmin(Boolean admin) { @Override
public @Nullable GroupDTO setAdmin(@NotNull Boolean admin) {
this.admin.value = admin; this.admin.value = admin;
UpdateRow updateRow = new UpdateRow().field(this.admin); UpdateRow updateRow = new UpdateRow().field(this.admin);
return doUpdate(updateRow); return doUpdate(updateRow);
} }
public GroupDTO setFlagValue(Flag flag, Boolean value) { @Override
public GroupDTO setFlagValue(@NotNull Flag flag, @NotNull Boolean value) {
if (flag.isEnvironmentFlag()) {
return null;
}
flags.put(flag, value); flags.put(flag, value);
Field f = new Field(flag.getFlagName(), value); Field f = new Field(flag.getFlagName(), value);
UpdateRow updateRow = new UpdateRow().field(f); UpdateRow updateRow = new UpdateRow().field(f);
@ -90,19 +116,19 @@ public class GroupDTO {
InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null)); InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null));
insertRow.table("dominion_group") insertRow.table("dominion_group")
.field(group.domID) .field(group.domID)
.field(group.name) .field(group.name_raw)
.field(group.admin) .field(group.admin)
.field(group.name_colored); .field(group.name_color);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
insertRow.field(new Field(f.getFlagName(), dominionDTO.getFlagValue(f))); insertRow.field(new Field(f.getFlagName(), dominionDTO.getFlagValue(f)));
} }
try (ResultSet rs = insertRow.execute()) { try (ResultSet rs = insertRow.execute()) {
List<GroupDTO> groups = getDTOFromRS(rs); List<GroupDTO> groups = getDTOFromRS(rs);
if (groups.isEmpty()) return null; if (groups.isEmpty()) return null;
Cache.instance.loadGroups(groups.getFirst().getId()); Cache.instance.loadGroups(groups.get(0).getId());
return groups.getFirst(); return groups.get(0);
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("创建权限组失败: ", e, ""); DatabaseManager.handleDatabaseError("GroupDTO.create ", e, "");
return null; return null;
} }
} }
@ -125,14 +151,14 @@ public class GroupDTO {
String sql = "SELECT * FROM dominion_group WHERE id = ?;"; String sql = "SELECT * FROM dominion_group WHERE id = ?;";
List<GroupDTO> groups = getDTOFromRS(DatabaseManager.instance.query(sql, id)); List<GroupDTO> groups = getDTOFromRS(DatabaseManager.instance.query(sql, id));
if (groups.isEmpty()) return null; if (groups.isEmpty()) return null;
return groups.getFirst(); return groups.get(0);
} }
public static GroupDTO select(Integer domID, String name) { public static GroupDTO select(Integer domID, String name) {
String sql = "SELECT * FROM dominion_group WHERE dom_id = ? AND name = ?;"; String sql = "SELECT * FROM dominion_group WHERE dom_id = ? AND name = ?;";
List<GroupDTO> groups = getDTOFromRS(DatabaseManager.instance.query(sql, domID, name)); List<GroupDTO> groups = getDTOFromRS(DatabaseManager.instance.query(sql, domID, name));
if (groups.isEmpty()) return null; if (groups.isEmpty()) return null;
return groups.getFirst(); return groups.get(0);
} }
public static List<GroupDTO> selectAll() { public static List<GroupDTO> selectAll() {
@ -147,10 +173,10 @@ public class GroupDTO {
private GroupDTO(String name, Integer domID) { private GroupDTO(String name, Integer domID) {
this.domID.value = domID; this.domID.value = domID;
this.name.value = ColorParser.getPlainText(name); this.name_raw.value = ColorParser.getPlainText(name);
this.name_colored.value = name; this.name_color.value = name;
this.admin.value = false; this.admin.value = false;
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, f.getDefaultValue()); flags.put(f, f.getDefaultValue());
} }
} }
@ -158,10 +184,10 @@ public class GroupDTO {
private GroupDTO(Integer id, Integer domID, String name, Boolean admin, Map<Flag, Boolean> flags, String nameColored) { private GroupDTO(Integer id, Integer domID, String name, Boolean admin, Map<Flag, Boolean> flags, String nameColored) {
this.id.value = id; this.id.value = id;
this.domID.value = domID; this.domID.value = domID;
this.name.value = name; this.name_raw.value = name;
this.admin.value = admin; this.admin.value = admin;
this.flags.putAll(flags); this.flags.putAll(flags);
this.name_colored.value = nameColored; this.name_color.value = nameColored;
} }
private static List<GroupDTO> getDTOFromRS(ResultSet rs) { private static List<GroupDTO> getDTOFromRS(ResultSet rs) {
@ -170,7 +196,7 @@ public class GroupDTO {
try { try {
while (rs.next()) { while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>(); Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName())); flags.put(f, rs.getBoolean(f.getFlagName()));
} }
GroupDTO group = new GroupDTO( GroupDTO group = new GroupDTO(
@ -197,7 +223,7 @@ public class GroupDTO {
List<GroupDTO> groups = getDTOFromRS(rs); List<GroupDTO> groups = getDTOFromRS(rs);
if (groups.isEmpty()) return null; if (groups.isEmpty()) return null;
Cache.instance.loadGroups((Integer) id.value); Cache.instance.loadGroups((Integer) id.value);
return groups.getFirst(); return groups.get(0);
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("更新权限组失败: ", e, ""); DatabaseManager.handleDatabaseError("更新权限组失败: ", e, "");
return null; return null;

View File

@ -1,23 +1,26 @@
package cn.lunadeer.dominion.dtos; package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.api.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field; import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.FieldType; import cn.lunadeer.minecraftpluginutils.databse.FieldType;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.*; import java.util.*;
public class MemberDTO { public class MemberDTO implements cn.lunadeer.dominion.api.dtos.MemberDTO {
private static List<MemberDTO> query(String sql, Object... params) { private static List<MemberDTO> query(String sql, Object... params) {
List<MemberDTO> players = new ArrayList<>(); List<MemberDTO> players = new ArrayList<>();
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
return getDTOFromRS(rs); return getDTOFromRS(rs);
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql); DatabaseManager.handleDatabaseError("MemberDTO.query ", e, sql);
} }
return players; return players;
} }
@ -28,7 +31,7 @@ public class MemberDTO {
try { try {
while (rs.next()) { while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>(); Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName())); flags.put(f, rs.getBoolean(f.getFlagName()));
} }
MemberDTO player = new MemberDTO( MemberDTO player = new MemberDTO(
@ -42,7 +45,7 @@ public class MemberDTO {
players.add(player); players.add(player);
} }
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, ""); DatabaseManager.handleDatabaseError("MemberDTO.getDTOFromRS ", e, "");
} }
return players; return players;
} }
@ -53,11 +56,11 @@ public class MemberDTO {
.where("id = ?", id.value); .where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) { try (ResultSet rs = updateRow.execute()) {
List<MemberDTO> players = getDTOFromRS(rs); List<MemberDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null; if (players.isEmpty()) return null;
Cache.instance.loadMembers(getPlayerUUID()); Cache.instance.loadMembers(getPlayerUUID());
return players.get(0); return players.get(0);
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, ""); DatabaseManager.handleDatabaseError("MemberDTO.doUpdate ", e, "");
return null; return null;
} }
} }
@ -68,16 +71,16 @@ public class MemberDTO {
.field(player.playerUUID) .field(player.playerUUID)
.field(player.admin) .field(player.admin)
.field(player.domID); .field(player.domID);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f))); insertRow.field(new Field(f.getFlagName(), player.getFlagValue(f)));
} }
try (ResultSet rs = insertRow.execute()) { try (ResultSet rs = insertRow.execute()) {
Cache.instance.loadMembers(player.getPlayerUUID()); Cache.instance.loadMembers(player.getPlayerUUID());
List<MemberDTO> players = getDTOFromRS(rs); List<MemberDTO> players = getDTOFromRS(rs);
if (players.size() == 0) return null; if (players.isEmpty()) return null;
return players.get(0); return players.get(0);
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("插入玩家权限失败: ", e, ""); DatabaseManager.handleDatabaseError("MemberDTO.insert ", e, "");
return null; return null;
} }
} }
@ -85,7 +88,7 @@ public class MemberDTO {
public static MemberDTO select(UUID playerUUID, Integer dom_id) { public static MemberDTO select(UUID playerUUID, Integer dom_id) {
String sql = "SELECT * FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;"; String sql = "SELECT * FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;";
List<MemberDTO> p = query(sql, playerUUID.toString(), dom_id); List<MemberDTO> p = query(sql, playerUUID.toString(), dom_id);
if (p.size() == 0) return null; if (p.isEmpty()) return null;
return p.get(0); return p.get(0);
} }
@ -126,41 +129,57 @@ public class MemberDTO {
Field domID = new Field("dom_id", FieldType.INT); Field domID = new Field("dom_id", FieldType.INT);
Field groupId = new Field("group_id", FieldType.INT); Field groupId = new Field("group_id", FieldType.INT);
@Override
public Integer getId() { public Integer getId() {
return (Integer) id.value; return (Integer) id.value;
} }
@Override
public UUID getPlayerUUID() { public UUID getPlayerUUID() {
return UUID.fromString((String) playerUUID.value); return UUID.fromString((String) playerUUID.value);
} }
@Override
public Boolean getAdmin() { public Boolean getAdmin() {
return (Boolean) admin.value; return (Boolean) admin.value;
} }
@Override
public Integer getDomID() { public Integer getDomID() {
return (Integer) domID.value; return (Integer) domID.value;
} }
@Override
public Integer getGroupId() { public Integer getGroupId() {
return (Integer) groupId.value; return (Integer) groupId.value;
} }
private final Map<Flag, Boolean> flags = new HashMap<>(); private final Map<Flag, Boolean> flags = new HashMap<>();
public Boolean getFlagValue(Flag flag) { @Override
public @NotNull Boolean getFlagValue(Flag flag) {
if (!flags.containsKey(flag)) return flag.getDefaultValue(); if (!flags.containsKey(flag)) return flag.getDefaultValue();
return flags.get(flag); return flags.get(flag);
} }
public MemberDTO setFlagValue(Flag flag, Boolean value) { @Override
public @NotNull Map<Flag, Boolean> getFlagsValue() {
return flags;
}
@Override
public MemberDTO setFlagValue(@NotNull Flag flag, @NotNull Boolean value) {
if (flag.isEnvironmentFlag()) {
return null;
}
flags.put(flag, value); flags.put(flag, value);
Field f = new Field(flag.getFlagName(), value); Field f = new Field(flag.getFlagName(), value);
UpdateRow updateRow = new UpdateRow().field(f); UpdateRow updateRow = new UpdateRow().field(f);
return doUpdate(updateRow); return doUpdate(updateRow);
} }
public MemberDTO setAdmin(Boolean admin) { @Override
public @Nullable MemberDTO setAdmin(@NotNull Boolean admin) {
this.admin.value = admin; this.admin.value = admin;
UpdateRow updateRow = new UpdateRow().field(this.admin); UpdateRow updateRow = new UpdateRow().field(this.admin);
return doUpdate(updateRow); return doUpdate(updateRow);
@ -175,7 +194,7 @@ public class MemberDTO {
public MemberDTO applyTemplate(PrivilegeTemplateDTO template) { public MemberDTO applyTemplate(PrivilegeTemplateDTO template) {
this.admin.value = template.getAdmin(); this.admin.value = template.getAdmin();
UpdateRow updateRow = new UpdateRow().field(admin); UpdateRow updateRow = new UpdateRow().field(admin);
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
this.flags.put(f, template.getFlagValue(f)); this.flags.put(f, template.getFlagValue(f));
updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f))); updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f)));
} }
@ -196,9 +215,7 @@ public class MemberDTO {
this.playerUUID.value = playerUUID.toString(); this.playerUUID.value = playerUUID.toString();
this.admin.value = false; this.admin.value = false;
this.domID.value = dom.getId(); this.domID.value = dom.getId();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { this.flags.putAll(dom.getGuestPrivilegeFlagValue());
this.flags.put(f, dom.getFlagValue(f));
}
} }
} }

View File

@ -53,7 +53,7 @@ public class PlayerDTO {
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
return getDTOFromRS(rs); return getDTOFromRS(rs);
} catch (SQLException e) { } catch (SQLException e) {
DatabaseManager.handleDatabaseError("查询玩家信息失败: ", e, sql); DatabaseManager.handleDatabaseError("PlayerDTO.query ", e, sql);
} }
return players; return players;
} }
@ -77,14 +77,14 @@ public class PlayerDTO {
String sql = "SELECT * FROM player_name WHERE uuid = ?;"; String sql = "SELECT * FROM player_name WHERE uuid = ?;";
List<PlayerDTO> players = query(sql, uuid.toString()); List<PlayerDTO> players = query(sql, uuid.toString());
if (players.isEmpty()) return null; if (players.isEmpty()) return null;
return players.getFirst(); return players.get(0);
} }
public static PlayerDTO select(String name) { public static PlayerDTO select(String name) {
String sql = "SELECT * FROM player_name WHERE last_known_name = ?;"; String sql = "SELECT * FROM player_name WHERE last_known_name = ?;";
List<PlayerDTO> players = query(sql, name); List<PlayerDTO> players = query(sql, name);
if (players.isEmpty()) return null; if (players.isEmpty()) return null;
return players.getFirst(); return players.get(0);
} }
public static List<PlayerDTO> search(String name) { public static List<PlayerDTO> search(String name) {
@ -114,9 +114,9 @@ public class PlayerDTO {
try (ResultSet rs = insertRow.execute()) { try (ResultSet rs = insertRow.execute()) {
List<PlayerDTO> players = getDTOFromRS(rs); List<PlayerDTO> players = getDTOFromRS(rs);
if (players.isEmpty()) return null; if (players.isEmpty()) return null;
return players.getFirst(); return players.get(0);
} catch (SQLException e) { } catch (SQLException e) {
DatabaseManager.handleDatabaseError("插入玩家信息失败: ", e, insertRow.toString()); DatabaseManager.handleDatabaseError("PlayerDTO.insert ", e, insertRow.toString());
return null; return null;
} }
} }
@ -136,9 +136,9 @@ public class PlayerDTO {
try (ResultSet rs = updateRow.execute()) { try (ResultSet rs = updateRow.execute()) {
List<PlayerDTO> players = getDTOFromRS(rs); List<PlayerDTO> players = getDTOFromRS(rs);
if (players.isEmpty()) return null; if (players.isEmpty()) return null;
return players.getFirst(); return players.get(0);
} catch (SQLException e) { } catch (SQLException e) {
DatabaseManager.handleDatabaseError("更新玩家信息失败: ", e, updateRow.toString()); DatabaseManager.handleDatabaseError("PlayerDTO.update ", e, updateRow.toString());
return null; return null;
} }
} }

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion.dtos; package cn.lunadeer.dominion.dtos;
import cn.lunadeer.dominion.api.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.Field; import cn.lunadeer.minecraftpluginutils.databse.Field;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
@ -15,7 +16,7 @@ public class PrivilegeTemplateDTO {
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) { try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
return getDTOFromRS(rs); return getDTOFromRS(rs);
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, sql); DatabaseManager.handleDatabaseError("PrivilegeTemplateDTO.query ", e, sql);
} }
return templates; return templates;
} }
@ -26,7 +27,7 @@ public class PrivilegeTemplateDTO {
try { try {
while (rs.next()) { while (rs.next()) {
Map<Flag, Boolean> flags = new HashMap<>(); Map<Flag, Boolean> flags = new HashMap<>();
for (Flag f : Flag.getPrivilegeFlagsEnabled()) { for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
flags.put(f, rs.getBoolean(f.getFlagName())); flags.put(f, rs.getBoolean(f.getFlagName()));
} }
PrivilegeTemplateDTO template = new PrivilegeTemplateDTO( PrivilegeTemplateDTO template = new PrivilegeTemplateDTO(
@ -39,7 +40,7 @@ public class PrivilegeTemplateDTO {
templates.add(template); templates.add(template);
} }
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, null); DatabaseManager.handleDatabaseError("PrivilegeTemplateDTO.getDTOFromRS", e, null);
} }
return templates; return templates;
} }
@ -53,10 +54,10 @@ public class PrivilegeTemplateDTO {
.returningAll(); .returningAll();
try (ResultSet rs = insertRow.execute()) { try (ResultSet rs = insertRow.execute()) {
List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs); List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs);
if (templates.size() == 0) return null; if (templates.isEmpty()) return null;
return templates.get(0); return templates.get(0);
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("创建权限模版失败: ", e, null); DatabaseManager.handleDatabaseError("PrivilegeTemplateDTO.create ", e, null);
return null; return null;
} }
} }
@ -68,10 +69,10 @@ public class PrivilegeTemplateDTO {
.where("id = ?", id.value); .where("id = ?", id.value);
try (ResultSet rs = updateRow.execute()) { try (ResultSet rs = updateRow.execute()) {
List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs); List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs);
if (templates.size() == 0) return null; if (templates.isEmpty()) return null;
return templates.get(0); return templates.get(0);
} catch (Exception e) { } catch (Exception e) {
DatabaseManager.handleDatabaseError("更新权限模版失败: ", e, null); DatabaseManager.handleDatabaseError("PrivilegeTemplateDTO.doUpdate ", e, null);
return null; return null;
} }
} }
@ -79,7 +80,7 @@ public class PrivilegeTemplateDTO {
public static PrivilegeTemplateDTO select(UUID creator, String name) { public static PrivilegeTemplateDTO select(UUID creator, String name) {
String sql = "SELECT * FROM privilege_template WHERE creator = ? AND name = ?;"; String sql = "SELECT * FROM privilege_template WHERE creator = ? AND name = ?;";
List<PrivilegeTemplateDTO> templates = query(sql, creator.toString(), name); List<PrivilegeTemplateDTO> templates = query(sql, creator.toString(), name);
if (templates.size() == 0) return null; if (templates.isEmpty()) return null;
return templates.get(0); return templates.get(0);
} }
@ -101,9 +102,9 @@ public class PrivilegeTemplateDTO {
this.flags.putAll(flags); this.flags.putAll(flags);
} }
private Integer id; private final Integer id;
private UUID creator; private final UUID creator;
private String name; private final String name;
private Boolean admin; private Boolean admin;
private final Map<Flag, Boolean> flags = new HashMap<>(); private final Map<Flag, Boolean> flags = new HashMap<>();

View File

@ -2,26 +2,27 @@ package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.utils.MessageDisplay;
import cn.lunadeer.minecraftpluginutils.VaultConnect.VaultConnect; import cn.lunadeer.minecraftpluginutils.VaultConnect.VaultConnect;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ConfigManager { public class ConfigManager {
public static ConfigManager instance;
public ConfigManager(Dominion plugin) { public ConfigManager(Dominion plugin) {
instance = this;
new Translation(plugin); new Translation(plugin);
_plugin = plugin; _plugin = plugin;
_plugin.saveDefaultConfig(); _plugin.saveDefaultConfig();
reload(); reload();
_plugin.saveConfig();
} }
public void reload() { public void reload() {
@ -38,29 +39,26 @@ public class ConfigManager {
_db_name = _file.getString("Database.Name", "dominion"); _db_name = _file.getString("Database.Name", "dominion");
_db_user = _file.getString("Database.User", "postgres"); _db_user = _file.getString("Database.User", "postgres");
_db_pass = _file.getString("Database.Pass", "postgres"); _db_pass = _file.getString("Database.Pass", "postgres");
_auto_create_radius = _file.getInt("AutoCreateRadius", 10); _auto_create_radius = _file.getInt("AutoCreateRadius", 10);
if (_auto_create_radius == 0) { _default_join_message = _file.getString("DefaultJoinMessage", "&3{OWNER}: Welcome to {DOM}!");
XLogger.err(Translation.Config_Check_AutoCreateRadiusError); _default_leave_message = _file.getString("DefaultLeaveMessage", "&3{OWNER}: Leaving {DOM}...");
setAutoCreateRadius(10);
} _message_display_no_permission = _file.getString("MessageDisplay.NoPermission", "ACTION_BAR");
_message_display_join_leave = _file.getString("MessageDisplay.JoinLeave", "ACTION_BAR");
_spawn_protection = _file.getInt("Limit.SpawnProtection", 10); _spawn_protection = _file.getInt("Limit.SpawnProtection", 10);
_blue_map = _file.getBoolean("BlueMap", false); _blue_map = _file.getBoolean("BlueMap", false);
_dynmap = _file.getBoolean("Dynmap", false); _dynmap = _file.getBoolean("Dynmap", false);
_auto_clean_after_days = _file.getInt("AutoCleanAfterDays", 180); _auto_clean_after_days = _file.getInt("AutoCleanAfterDays", 180);
if (_auto_clean_after_days == 0) {
XLogger.err(Translation.Config_Check_AutoCleanAfterDaysError);
setAutoCleanAfterDays(180);
}
_limit_op_bypass = _file.getBoolean("Limit.OpByPass", true); _limit_op_bypass = _file.getBoolean("Limit.OpByPass", true);
_check_update = _file.getBoolean("CheckUpdate", true); _check_update = _file.getBoolean("CheckUpdate", true);
_tp_enable = _file.getBoolean("Teleport.Enable", false); _tp_enable = _file.getBoolean("Teleport.Enable", false);
_tp_delay = _file.getInt("Teleport.Delay", 0); _tp_delay = _file.getInt("Teleport.Delay", 0);
_tp_cool_down = _file.getInt("Teleport.CoolDown", 0); _tp_cool_down = _file.getInt("Teleport.CoolDown", 0);
_tool = _file.getString("Tool", "ARROW"); _tool = _file.getString("Tool", "ARROW");
if (Material.getMaterial(_tool) == null) { _info_tool = _file.getString("InfoTool", "STRING");
XLogger.err(Translation.Config_Check_ToolNameError);
setTool("ARROW");
}
_economy_enable = _file.getBoolean("Economy.Enable", false); _economy_enable = _file.getBoolean("Economy.Enable", false);
if (getEconomyEnable()) { if (getEconomyEnable()) {
new VaultConnect(this._plugin); new VaultConnect(this._plugin);
@ -72,61 +70,40 @@ public class ConfigManager {
_group_title_suffix = _file.getString("GroupTitle.Suffix", "&#ffffff]"); _group_title_suffix = _file.getString("GroupTitle.Suffix", "&#ffffff]");
GroupLimit defaultGroup = new GroupLimit(); GroupLimit defaultGroup = new GroupLimit();
defaultGroup.setLimitSizeX(_file.getInt("Limit.SizeX", 128)); if (_file.contains("Limit.SizeX")) { // todo: should be removed in the future
defaultGroup.setLimitSizeY(_file.getInt("Limit.SizeY", 64)); defaultGroup.setLimitSizeMaxX(_file.getInt("Limit.SizeX", 128), null);
defaultGroup.setLimitSizeZ(_file.getInt("Limit.SizeZ", 128)); defaultGroup.setLimitSizeMaxY(_file.getInt("Limit.SizeY", 64), null);
defaultGroup.setLimitMinY(_file.getInt("Limit.MinY", -64)); defaultGroup.setLimitSizeMaxZ(_file.getInt("Limit.SizeZ", 128), null);
defaultGroup.setLimitMaxY(_file.getInt("Limit.MaxY", 320)); defaultGroup.setLimitSizeMinX(4, null);
defaultGroup.setLimitAmount(_file.getInt("Limit.Amount", 10)); defaultGroup.setLimitSizeMinY(4, null);
defaultGroup.setLimitDepth(_file.getInt("Limit.Depth", 3)); defaultGroup.setLimitSizeMinZ(4, null);
defaultGroup.setLimitVert(_file.getBoolean("Limit.Vert", false)); } else {
defaultGroup.setWorldBlackList(_file.getStringList("Limit.WorldBlackList")); defaultGroup.setLimitSizeMaxX(_file.getInt("Limit.Size.MaxX", 128), null);
defaultGroup.setLimitSizeMaxY(_file.getInt("Limit.Size.MaxY", 64), null);
defaultGroup.setLimitSizeMaxZ(_file.getInt("Limit.Size.MaxZ", 128), null);
defaultGroup.setLimitSizeMinX(_file.getInt("Limit.Size.MinX", 4), null);
defaultGroup.setLimitSizeMinY(_file.getInt("Limit.Size.MinY", 4), null);
defaultGroup.setLimitSizeMinZ(_file.getInt("Limit.Size.MinZ", 4), null);
}
defaultGroup.setLimitMinY(_file.getInt("Limit.MinY", -64), null);
defaultGroup.setLimitMaxY(_file.getInt("Limit.MaxY", 320), null);
defaultGroup.setLimitAmount(_file.getInt("Limit.Amount", 10), null);
defaultGroup.setLimitDepth(_file.getInt("Limit.Depth", 3), null);
defaultGroup.setLimitVert(_file.getBoolean("Limit.Vert", false), null);
defaultGroup.setPrice(_file.getDouble("Economy.Price", 10.0)); defaultGroup.setPrice(_file.getDouble("Economy.Price", 10.0));
defaultGroup.setPriceOnlyXZ(_file.getBoolean("Economy.OnlyXZ", false)); defaultGroup.setPriceOnlyXZ(_file.getBoolean("Economy.OnlyXZ", false));
defaultGroup.setRefundRatio(_file.getDouble("Economy.Refund", 0.85)); defaultGroup.setRefundRatio(_file.getDouble("Economy.Refund", 0.85));
if (defaultGroup.getLimitSizeX() <= 4 && defaultGroup.getLimitSizeX() != -1) { ConfigurationSection worldSettings = _file.getConfigurationSection("Limit.WorldSettings");
XLogger.err(Translation.Config_Check_LimitSizeXError); if (worldSettings != null) {
setLimitSizeX(128); defaultGroup.addWorldLimits(WorldSetting.load("config.yml", worldSettings));
} }
if (defaultGroup.getLimitSizeY() <= 4 && defaultGroup.getLimitSizeY() != -1) { groupLimits.put("default", defaultGroup);
XLogger.err(Translation.Config_Check_LimitSizeYError);
setLimitSizeY(64);
}
if (defaultGroup.getLimitSizeZ() <= 4 && defaultGroup.getLimitSizeZ() != -1) {
XLogger.err(Translation.Config_Check_LimitSizeZError);
setLimitSizeZ(128);
}
if (defaultGroup.getLimitMinY() >= defaultGroup.getLimitMaxY()) {
XLogger.err(Translation.Config_Check_LimitMinYError);
setLimitMinY(-64);
setLimitMaxY(320);
}
if (defaultGroup.getRefundRatio() < 0.0 || defaultGroup.getRefundRatio() > 1.0) {
XLogger.err(Translation.Config_Check_RefundError);
setEconomyRefund(0.85f);
}
if (defaultGroup.getPrice() < 0.0) {
XLogger.err(Translation.Config_Check_PriceError);
setEconomyPrice(10.0f);
}
if (defaultGroup.getLimitVert() && defaultGroup.getLimitSizeY() <= defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY()) {
XLogger.warn(Translation.Config_Check_LimitSizeYAutoAdjust, (defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY() + 1));
setLimitSizeY(defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY() + 1);
}
if (defaultGroup.getLimitAmount() < 0 && defaultGroup.getLimitAmount() != -1) {
XLogger.err(Translation.Config_Check_AmountError);
setLimitAmount(10);
}
if (defaultGroup.getLimitDepth() < 0 && defaultGroup.getLimitDepth() != -1) {
XLogger.err(Translation.Config_Check_DepthError);
setLimitDepth(3);
}
limits.put("default", defaultGroup);
limits.putAll(GroupLimit.loadGroups(_plugin)); groupLimits.putAll(GroupLimit.loadGroups(_plugin));
checkRules();
saveAll(); // 回写文件 防止文件中的数据不完整 saveAll(); // 回写文件 防止文件中的数据不完整
Flag.loadFromJson(); // 加载 Flag 配置 Flag.loadFromFile(); // 加载 Flag 配置
} }
public void saveAll() { public void saveAll() {
@ -151,30 +128,46 @@ public class ConfigManager {
_file.set("AutoCreateRadius", _auto_create_radius); _file.set("AutoCreateRadius", _auto_create_radius);
_file.setComments("AutoCreateRadius", Arrays.asList(Translation.Config_Comment_AutoCreateRadius.trans(), Translation.Config_Comment_NegativeOneDisabled.trans())); _file.setComments("AutoCreateRadius", Arrays.asList(Translation.Config_Comment_AutoCreateRadius.trans(), Translation.Config_Comment_NegativeOneDisabled.trans()));
_file.set("DefaultJoinMessage", _default_join_message);
_file.setComments("DefaultJoinMessage", Collections.singletonList(Translation.Config_Comment_DefaultJoinMessage.trans()));
_file.set("DefaultLeaveMessage", _default_leave_message);
_file.setComments("DefaultLeaveMessage", Collections.singletonList(Translation.Config_Comment_DefaultLeaveMessage.trans()));
_file.setComments("MessageDisplay", Collections.singletonList(Translation.Config_Comment_MessageDisplay.trans()));
_file.set("MessageDisplay.NoPermission", _message_display_no_permission);
_file.setComments("MessageDisplay.NoPermission", Collections.singletonList(Translation.Config_Comment_MessageDisplayNoPermission.trans()));
_file.set("MessageDisplay.JoinLeave", _message_display_join_leave);
_file.setComments("MessageDisplay.JoinLeave", Collections.singletonList(Translation.Config_Comment_MessageDisplayJoinLeave.trans()));
_file.setComments("Limit", List.of(Translation.Config_Comment_DefaultLimit.trans())); _file.setComments("Limit", List.of(Translation.Config_Comment_DefaultLimit.trans()));
_file.set("Limit.SpawnProtection", _spawn_protection); _file.set("Limit.SpawnProtection", _spawn_protection);
_file.setInlineComments("Limit.SpawnProtection", Arrays.asList(Translation.Config_Comment_SpawnProtectRadius.trans(), Translation.Config_Comment_NegativeOneDisabled.trans())); _file.setInlineComments("Limit.SpawnProtection", List.of(Translation.Config_Comment_SpawnProtectRadius.trans() + Translation.Config_Comment_NegativeOneDisabled.trans()));
_file.set("Limit.MinY", limits.get("default").getLimitMinY()); _file.set("Limit.MinY", groupLimits.get("default").getLimitMinY(null));
_file.setInlineComments("Limit.MinY", List.of(Translation.Config_Comment_MinY.trans())); _file.setInlineComments("Limit.MinY", List.of(Translation.Config_Comment_MinY.trans()));
_file.set("Limit.MaxY", limits.get("default").getLimitMaxY()); _file.set("Limit.MaxY", groupLimits.get("default").getLimitMaxY(null));
_file.setInlineComments("Limit.MaxY", List.of(Translation.Config_Comment_MaxY.trans())); _file.setInlineComments("Limit.MaxY", List.of(Translation.Config_Comment_MaxY.trans()));
_file.set("Limit.SizeX", limits.get("default").getLimitSizeX()); _file.set("Limit.Size.MaxX", groupLimits.get("default").getLimitSizeMaxX(null));
_file.setInlineComments("Limit.SizeX", Arrays.asList(Translation.Config_Comment_SizeX.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans())); _file.setInlineComments("Limit.Size.MaxX", List.of(Translation.Config_Comment_SizeMaxX.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
_file.set("Limit.SizeY", limits.get("default").getLimitSizeY()); _file.set("Limit.Size.MaxY", groupLimits.get("default").getLimitSizeMaxY(null));
_file.setInlineComments("Limit.SizeY", Arrays.asList(Translation.Config_Comment_SizeY.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans())); _file.setInlineComments("Limit.Size.MaxY", List.of(Translation.Config_Comment_SizeMaxY.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
_file.set("Limit.SizeZ", limits.get("default").getLimitSizeZ()); _file.set("Limit.Size.MaxZ", groupLimits.get("default").getLimitSizeMaxZ(null));
_file.setInlineComments("Limit.SizeZ", Arrays.asList(Translation.Config_Comment_SizeZ.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans())); _file.setInlineComments("Limit.Size.MaxZ", List.of(Translation.Config_Comment_SizeMaxZ.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
_file.set("Limit.Amount", limits.get("default").getLimitAmount()); _file.set("Limit.Size.MinX", groupLimits.get("default").getLimitSizeMinX(null));
_file.setInlineComments("Limit.Amount", List.of(Translation.Config_Comment_Amount.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans())); _file.setInlineComments("Limit.Size.MinX", List.of(Translation.Config_Comment_SizeMinX.trans()));
_file.set("Limit.Depth", limits.get("default").getLimitDepth()); _file.set("Limit.Size.MinY", groupLimits.get("default").getLimitSizeMinY(null));
_file.setInlineComments("Limit.Depth", List.of(Translation.Config_Comment_Depth.trans(), Translation.Config_Comment_ZeroDisabled.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans())); _file.setInlineComments("Limit.Size.MinY", List.of(Translation.Config_Comment_SizeMinY.trans()));
_file.set("Limit.Vert", limits.get("default").getLimitVert()); _file.set("Limit.Size.MinZ", groupLimits.get("default").getLimitSizeMinZ(null));
_file.setInlineComments("Limit.Size.MinZ", List.of(Translation.Config_Comment_SizeMinZ.trans()));
_file.set("Limit.Amount", groupLimits.get("default").getLimitAmount(null));
_file.setInlineComments("Limit.Amount", List.of(Translation.Config_Comment_Amount.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
_file.set("Limit.Depth", groupLimits.get("default").getLimitDepth(null));
_file.setInlineComments("Limit.Depth", List.of(Translation.Config_Comment_Depth.trans() + Translation.Config_Comment_ZeroDisabled.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
_file.set("Limit.Vert", groupLimits.get("default").getLimitVert(null));
_file.setInlineComments("Limit.Vert", List.of(Translation.Config_Comment_Vert.trans())); _file.setInlineComments("Limit.Vert", List.of(Translation.Config_Comment_Vert.trans()));
_file.set("Limit.WorldBlackList", limits.get("default").getWorldBlackList());
_file.setInlineComments("Limit.WorldBlackList", List.of(Translation.Config_Comment_DisabledWorlds.trans()));
_file.set("Limit.OpByPass", _limit_op_bypass); _file.set("Limit.OpByPass", _limit_op_bypass);
_file.setInlineComments("Limit.OpByPass", List.of(Translation.Config_Comment_OpBypass.trans())); _file.setInlineComments("Limit.OpByPass", List.of(Translation.Config_Comment_OpBypass.trans()));
_file.set("Limit.WorldSettings", groupLimits.get("default").getWorldSettings());
_file.setInlineComments("Limit.WorldSettings", List.of(Translation.Config_Comment_WorldSettings.trans()));
_file.set("Teleport.Enable", _tp_enable); _file.set("Teleport.Enable", _tp_enable);
_file.set("Teleport.Delay", _tp_delay); _file.set("Teleport.Delay", _tp_delay);
@ -187,14 +180,16 @@ public class ConfigManager {
_file.set("Tool", _tool); _file.set("Tool", _tool);
_file.setComments("Tool", List.of(Translation.Config_Comment_ToolName.trans())); _file.setComments("Tool", List.of(Translation.Config_Comment_ToolName.trans()));
_file.set("InfoTool", _info_tool);
_file.setComments("InfoTool", List.of(Translation.Config_Comment_InfoToolName.trans()));
_file.setComments("Economy", Arrays.asList(Translation.Config_Comment_Economy.trans(), Translation.Config_Comment_VaultRequired.trans())); _file.setComments("Economy", Arrays.asList(Translation.Config_Comment_Economy.trans(), Translation.Config_Comment_VaultRequired.trans()));
_file.set("Economy.Enable", _economy_enable); _file.set("Economy.Enable", _economy_enable);
_file.set("Economy.Price", limits.get("default").getPrice()); _file.set("Economy.Price", groupLimits.get("default").getPrice());
_file.setInlineComments("Economy.Price", List.of(Translation.Config_Comment_Price.trans())); _file.setInlineComments("Economy.Price", List.of(Translation.Config_Comment_Price.trans()));
_file.set("Economy.OnlyXZ", limits.get("default").getPriceOnlyXZ()); _file.set("Economy.OnlyXZ", groupLimits.get("default").getPriceOnlyXZ());
_file.setInlineComments("Economy.OnlyXZ", List.of(Translation.Config_Comment_OnlyXZ.trans())); _file.setInlineComments("Economy.OnlyXZ", List.of(Translation.Config_Comment_OnlyXZ.trans()));
_file.set("Economy.Refund", limits.get("default").getRefundRatio()); _file.set("Economy.Refund", groupLimits.get("default").getRefundRatio());
_file.setInlineComments("Economy.Refund", List.of(Translation.Config_Comment_Refund.trans())); _file.setInlineComments("Economy.Refund", List.of(Translation.Config_Comment_Refund.trans()));
_file.set("FlyPermissionNodes", _fly_permission_nodes); _file.set("FlyPermissionNodes", _fly_permission_nodes);
@ -242,12 +237,6 @@ public class ConfigManager {
return _db_type; return _db_type;
} }
public void setDbType(String db_type) {
_db_type = db_type;
_file.set("Database.Type", db_type);
_plugin.saveConfig();
}
public String getDbHost() { public String getDbHost() {
return _db_host; return _db_host;
} }
@ -263,7 +252,6 @@ public class ConfigManager {
public void setDbUser(String db_user) { public void setDbUser(String db_user) {
_db_user = db_user; _db_user = db_user;
_file.set("Database.User", db_user); _file.set("Database.User", db_user);
_plugin.saveConfig();
} }
public String getDbUser() { public String getDbUser() {
@ -276,51 +264,51 @@ public class ConfigManager {
public void setDbPass(String db_pass) { public void setDbPass(String db_pass) {
_db_pass = db_pass; _db_pass = db_pass;
_file.set("Database.Pass", db_pass); _file.set("Database.Pass", db_pass);
_plugin.saveConfig();
} }
public String getDbPass() { public String getDbPass() {
return _db_pass; return _db_pass;
} }
public Integer getLimitSizeX(Player player) { public Integer getLimitSizeMaxX(Player player) {
return limits.get(getPlayerGroup(player)).getLimitSizeX(); return groupLimits.get(getPlayerGroup(player)).getLimitSizeMaxX(player.getWorld());
} }
public void setLimitSizeX(Integer max_x) { public Integer getLimitSizeMaxY(Player player) {
limits.get("default").setLimitSizeX(max_x); return groupLimits.get(getPlayerGroup(player)).getLimitSizeMaxY(player.getWorld());
_file.set("Limit.SizeX", max_x);
_plugin.saveConfig();
} }
public Integer getLimitSizeY(Player player) { public Integer getLimitSizeMaxZ(Player player) {
return limits.get(getPlayerGroup(player)).getLimitSizeY(); return groupLimits.get(getPlayerGroup(player)).getLimitSizeMaxZ(player.getWorld());
} }
public void setLimitSizeY(Integer max_y) { public Integer getLimitSizeMinX(Player player) {
limits.get("default").setLimitSizeY(max_y); return groupLimits.get(getPlayerGroup(player)).getLimitSizeMinX(player.getWorld());
_file.set("Limit.SizeY", max_y);
_plugin.saveConfig();
} }
public Integer getLimitSizeZ(Player player) { public Integer getLimitSizeMinY(Player player) {
return limits.get(getPlayerGroup(player)).getLimitSizeZ(); return groupLimits.get(getPlayerGroup(player)).getLimitSizeMinY(player.getWorld());
} }
public void setLimitSizeZ(Integer max_z) { public Integer getLimitSizeMinZ(Player player) {
limits.get("default").setLimitSizeZ(max_z); return groupLimits.get(getPlayerGroup(player)).getLimitSizeMinZ(player.getWorld());
_file.set("Limit.SizeZ", max_z);
_plugin.saveConfig();
} }
public Integer getAutoCreateRadius() { public Integer getAutoCreateRadius() {
return _auto_create_radius; return _auto_create_radius;
} }
public String getDefaultJoinMessage() {
return _default_join_message;
}
public String getDefaultLeaveMessage() {
return _default_leave_message;
}
public void setAutoCreateRadius(Integer radius) { public void setAutoCreateRadius(Integer radius) {
_auto_create_radius = radius; _auto_create_radius = radius;
_file.set("AutoCreateRadius", radius); _file.set("AutoCreateRadius", radius);
_plugin.saveConfig();
} }
public Boolean getBlueMap() { public Boolean getBlueMap() {
@ -335,76 +323,47 @@ public class ConfigManager {
return _auto_clean_after_days; return _auto_clean_after_days;
} }
public MessageDisplay.Place getMessageDisplayNoPermission() {
return MessageDisplay.Place.valueOf(_message_display_no_permission);
}
public MessageDisplay.Place getMessageDisplayJoinLeave() {
return MessageDisplay.Place.valueOf(_message_display_join_leave);
}
public void setAutoCleanAfterDays(Integer auto_clean_after_days) { public void setAutoCleanAfterDays(Integer auto_clean_after_days) {
_auto_clean_after_days = auto_clean_after_days; _auto_clean_after_days = auto_clean_after_days;
_file.set("AutoCleanAfterDays", auto_clean_after_days); _file.set("AutoCleanAfterDays", auto_clean_after_days);
_plugin.saveConfig();
} }
public Integer getLimitMinY(Player player) { public Integer getLimitMinY(Player player) {
return limits.get(getPlayerGroup(player)).getLimitMinY(); return groupLimits.get(getPlayerGroup(player)).getLimitMinY(player.getWorld());
}
public void setLimitMinY(Integer limit_bottom) {
limits.get("default").setLimitMinY(limit_bottom);
_file.set("Limit.MinY", limit_bottom);
_plugin.saveConfig();
} }
public Integer getLimitMaxY(Player player) { public Integer getLimitMaxY(Player player) {
return limits.get(getPlayerGroup(player)).getLimitMaxY(); return groupLimits.get(getPlayerGroup(player)).getLimitMaxY(player.getWorld());
}
public void setLimitMaxY(Integer limit_top) {
limits.get("default").setLimitMaxY(limit_top);
_file.set("Limit.MaxY", limit_top);
_plugin.saveConfig();
} }
public Integer getLimitAmount(Player player) { public Integer getLimitAmount(Player player) {
return limits.get(getPlayerGroup(player)).getLimitAmount(); return groupLimits.get(getPlayerGroup(player)).getLimitAmount(player.getWorld());
}
public void setLimitAmount(Integer limit_amount) {
limits.get("default").setLimitAmount(limit_amount);
_file.set("Limit.Amount", limit_amount);
_plugin.saveConfig();
} }
public Integer getLimitDepth(Player player) { public Integer getLimitDepth(Player player) {
return limits.get(getPlayerGroup(player)).getLimitDepth(); return groupLimits.get(getPlayerGroup(player)).getLimitDepth(player.getWorld());
}
public void setLimitDepth(Integer limit_depth) {
limits.get("default").setLimitDepth(limit_depth);
_file.set("Limit.Depth", limit_depth);
_plugin.saveConfig();
} }
public Boolean getLimitVert(Player player) { public Boolean getLimitVert(Player player) {
return limits.get(getPlayerGroup(player)).getLimitVert(); return groupLimits.get(getPlayerGroup(player)).getLimitVert(player.getWorld());
}
public void setLimitVert(Boolean limit_vert) {
limits.get("default").setLimitVert(limit_vert);
_file.set("Limit.Vert", limit_vert);
_plugin.saveConfig();
} }
public List<String> getWorldBlackList(Player player) { public List<String> getWorldBlackList(Player player) {
return limits.get(getPlayerGroup(player)).getWorldBlackList(); return groupLimits.get(getPlayerGroup(player)).getWorldBlackList();
} }
public Boolean getLimitOpBypass() { public Boolean getLimitOpBypass() {
return _limit_op_bypass; return _limit_op_bypass;
} }
public void setLimitOpBypass(Boolean limit_op_bypass) {
_limit_op_bypass = limit_op_bypass;
_file.set("Limit.OpByPass", limit_op_bypass);
_plugin.saveConfig();
}
public Boolean getCheckUpdate() { public Boolean getCheckUpdate() {
return _check_update; return _check_update;
} }
@ -413,12 +372,6 @@ public class ConfigManager {
return _tp_enable; return _tp_enable;
} }
public void setTpEnable(Boolean tp_enable) {
_tp_enable = tp_enable;
_file.set("Teleport.Enable", tp_enable);
_plugin.saveConfig();
}
public Integer getTpDelay() { public Integer getTpDelay() {
return _tp_delay; return _tp_delay;
} }
@ -426,7 +379,6 @@ public class ConfigManager {
public void setTpDelay(Integer tp_delay) { public void setTpDelay(Integer tp_delay) {
_tp_delay = tp_delay; _tp_delay = tp_delay;
_file.set("Teleport.Delay", tp_delay); _file.set("Teleport.Delay", tp_delay);
_plugin.saveConfig();
} }
public Integer getTpCoolDown() { public Integer getTpCoolDown() {
@ -436,7 +388,6 @@ public class ConfigManager {
public void setTpCoolDown(Integer tp_cool_down) { public void setTpCoolDown(Integer tp_cool_down) {
_tp_cool_down = tp_cool_down; _tp_cool_down = tp_cool_down;
_file.set("Teleport.CoolDown", tp_cool_down); _file.set("Teleport.CoolDown", tp_cool_down);
_plugin.saveConfig();
} }
public Material getTool() { public Material getTool() {
@ -446,79 +397,45 @@ public class ConfigManager {
public void setTool(String tool) { public void setTool(String tool) {
_tool = tool; _tool = tool;
_file.set("Tool", tool); _file.set("Tool", tool);
_plugin.saveConfig(); }
public Material getInfoTool() {
return Material.getMaterial(_info_tool);
}
public void setInfoTool(String info_tool) {
_info_tool = info_tool;
_file.set("InfoTool", info_tool);
} }
public Boolean getEconomyEnable() { public Boolean getEconomyEnable() {
return _economy_enable; return _economy_enable;
} }
public void setEconomyEnable(Boolean economy_enable) {
_economy_enable = economy_enable;
_file.set("Economy.Enable", economy_enable);
_plugin.saveConfig();
}
public Float getEconomyPrice(Player player) { public Float getEconomyPrice(Player player) {
return limits.get(getPlayerGroup(player)).getPrice().floatValue(); return groupLimits.get(getPlayerGroup(player)).getPrice().floatValue();
}
public void setEconomyPrice(Float economy_price) {
limits.get("default").setPrice((double) economy_price);
_file.set("Economy.Price", economy_price);
_plugin.saveConfig();
} }
public Boolean getEconomyOnlyXZ(Player player) { public Boolean getEconomyOnlyXZ(Player player) {
return limits.get(getPlayerGroup(player)).getPriceOnlyXZ(); return groupLimits.get(getPlayerGroup(player)).getPriceOnlyXZ();
}
public void setEconomyOnlyXZ(Boolean economy_only_xz) {
limits.get("default").setPriceOnlyXZ(economy_only_xz);
_file.set("Economy.OnlyXZ", economy_only_xz);
_plugin.saveConfig();
} }
public Float getEconomyRefund(Player player) { public Float getEconomyRefund(Player player) {
return limits.get(getPlayerGroup(player)).getRefundRatio().floatValue(); return groupLimits.get(getPlayerGroup(player)).getRefundRatio().floatValue();
}
public void setEconomyRefund(Float economy_refund) {
limits.get("default").setRefundRatio((double) economy_refund);
_file.set("Economy.Refund", economy_refund);
_plugin.saveConfig();
} }
public List<String> getFlyPermissionNodes() { public List<String> getFlyPermissionNodes() {
return _fly_permission_nodes; return _fly_permission_nodes;
} }
public void setFlyPermissionNodes(List<String> fly_permission_nodes) {
_fly_permission_nodes = fly_permission_nodes;
_file.set("FlyPermissionNodes", fly_permission_nodes);
_plugin.saveConfig();
}
public Boolean getResidenceMigration() { public Boolean getResidenceMigration() {
return _residence_migration; return _residence_migration;
} }
public void setResidenceMigration(Boolean residence_migration) {
_residence_migration = residence_migration;
_file.set("ResidenceMigration", residence_migration);
_plugin.saveConfig();
}
public Integer getSpawnProtection() { public Integer getSpawnProtection() {
return _spawn_protection; return _spawn_protection;
} }
public void setSpawnProtection(Integer spawn_protection) {
_spawn_protection = spawn_protection;
_file.set("Limit.SpawnProtection", spawn_protection);
_plugin.saveConfig();
}
public Boolean getGroupTitleEnable() { public Boolean getGroupTitleEnable() {
return _group_title_enable; return _group_title_enable;
} }
@ -526,27 +443,57 @@ public class ConfigManager {
public void setGroupTitleEnable(Boolean group_title_enable) { public void setGroupTitleEnable(Boolean group_title_enable) {
_group_title_enable = group_title_enable; _group_title_enable = group_title_enable;
_file.set("GroupTitle.Enable", group_title_enable); _file.set("GroupTitle.Enable", group_title_enable);
_plugin.saveConfig();
} }
public String getGroupTitlePrefix() { public String getGroupTitlePrefix() {
return _group_title_prefix; return _group_title_prefix;
} }
public void setGroupTitlePrefix(String group_title_prefix) {
_group_title_prefix = group_title_prefix;
_file.set("GroupTitle.Prefix", group_title_prefix);
_plugin.saveConfig();
}
public String getGroupTitleSuffix() { public String getGroupTitleSuffix() {
return _group_title_suffix; return _group_title_suffix;
} }
public void setGroupTitleSuffix(String group_title_suffix) { public String getLanguage() {
_group_title_suffix = group_title_suffix; return _language;
_file.set("GroupTitle.Suffix", group_title_suffix); }
_plugin.saveConfig();
public void checkRules() {
if (Material.getMaterial(_tool) == null) {
XLogger.err(Translation.Config_Check_ToolNameError);
setTool("ARROW");
}
if (Material.getMaterial(_info_tool) == null) {
XLogger.err(Translation.Config_Check_InfoToolNameError);
setInfoTool("STRING");
}
if (getAutoCreateRadius() <= 0 && getAutoCreateRadius() != -1) {
XLogger.err(Translation.Config_Check_AutoCreateRadiusError);
setAutoCreateRadius(10);
}
if (getAutoCleanAfterDays() <= 0 && getAutoCleanAfterDays() != -1) {
XLogger.err(Translation.Config_Check_AutoCleanAfterDaysError);
setAutoCleanAfterDays(180);
}
if (Arrays.stream(MessageDisplay.Place.values()).noneMatch(place -> place.name().equals(getMessageDisplayNoPermission().name()))) {
XLogger.err(Translation.Config_Check_MessageDisplayError, getMessageDisplayNoPermission());
_message_display_no_permission = "ACTION_BAR";
}
if (Arrays.stream(MessageDisplay.Place.values()).noneMatch(place -> place.name().equals(getMessageDisplayJoinLeave().name()))) {
XLogger.err(Translation.Config_Check_MessageDisplayError, getMessageDisplayJoinLeave());
_message_display_join_leave = "ACTION_BAR";
}
if (getTpDelay() < 0) {
XLogger.err(Translation.Config_Check_TpDelayError);
setTpDelay(0);
}
if (getTpCoolDown() < 0) {
XLogger.err(Translation.Config_Check_TpCoolDownError);
setTpCoolDown(0);
}
for (GroupLimit limit : groupLimits.values()) {
limit.checkRules();
}
} }
private final Dominion _plugin; private final Dominion _plugin;
@ -564,6 +511,8 @@ public class ConfigManager {
private String _language; private String _language;
private Integer _auto_create_radius; private Integer _auto_create_radius;
private String _default_join_message;
private String _default_leave_message;
private Boolean _limit_op_bypass; private Boolean _limit_op_bypass;
@ -576,7 +525,9 @@ public class ConfigManager {
private Boolean _tp_enable; private Boolean _tp_enable;
private Integer _tp_delay; private Integer _tp_delay;
private Integer _tp_cool_down; private Integer _tp_cool_down;
private String _tool; private String _tool;
private String _info_tool;
private Boolean _economy_enable; private Boolean _economy_enable;
@ -588,13 +539,16 @@ public class ConfigManager {
private String _group_title_prefix; private String _group_title_prefix;
private String _group_title_suffix; private String _group_title_suffix;
private final Map<String, GroupLimit> limits = new HashMap<>(); private String _message_display_no_permission;
private String _message_display_join_leave;
private final Map<String, GroupLimit> groupLimits = new HashMap<>();
private String getPlayerGroup(@Nullable Player player) { private String getPlayerGroup(@Nullable Player player) {
if (player == null) { if (player == null) {
return "default"; return "default";
} }
for (String group : limits.keySet()) { for (String group : groupLimits.keySet()) {
if (group.equals("default")) { if (group.equals("default")) {
continue; continue;
} }

View File

@ -1,16 +1,27 @@
package cn.lunadeer.dominion.managers; package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.commands.Operator;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.databse.*; import cn.lunadeer.minecraftpluginutils.databse.*;
import cn.lunadeer.minecraftpluginutils.databse.syntax.AddColumn; import cn.lunadeer.minecraftpluginutils.databse.syntax.AddColumn;
import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable; import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable;
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow; import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
import cn.lunadeer.minecraftpluginutils.databse.syntax.RemoveColumn; import cn.lunadeer.minecraftpluginutils.databse.syntax.RemoveColumn;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class DatabaseTables { public class DatabaseTables {
public static void migrate() { public static void migrate() {
@ -114,8 +125,8 @@ public class DatabaseTables {
Field server_dom_y2_field = new Field("y2", 2147483647); Field server_dom_y2_field = new Field("y2", 2147483647);
Field server_dom_z2_field = new Field("z2", 2147483647); Field server_dom_z2_field = new Field("z2", 2147483647);
Field server_dom_parent_dom_id_field = new Field("parent_dom_id", -1); Field server_dom_parent_dom_id_field = new Field("parent_dom_id", -1);
Field server_dom_join_message_field = new Field("join_message", "欢迎"); Field server_dom_join_message_field = new Field("join_message", "");
Field server_dom_leave_message_field = new Field("leave_message", "再见"); Field server_dom_leave_message_field = new Field("leave_message", "");
InsertRow insert_server_dom = new InsertRow().table("dominion").onConflictDoNothing(server_dom_id_field) InsertRow insert_server_dom = new InsertRow().table("dominion").onConflictDoNothing(server_dom_id_field)
.field(server_dom_id_field) .field(server_dom_id_field)
.field(server_dom_owner_field) .field(server_dom_owner_field)
@ -260,4 +271,79 @@ public class DatabaseTables {
new RemoveColumn("world").table("dominion").IfExists().execute(); new RemoveColumn("world").table("dominion").IfExists().execute();
} }
} }
private static final File export_path = new File(Dominion.instance.getDataFolder(), "ExportedDatabaseTables");
public static void Export(CommandSender sender) {
Scheduler.runTaskAsync(() -> {
Notification.info(sender, Translation.Commands_Operator_ExportDBBegin);
if (!export_path.exists()) {
export_path.mkdirs();
}
Common.ExportCSV("player_name", new File(export_path, "player_name.csv"));
Common.ExportCSV("privilege_template", new File(export_path, "privilege_template.csv"));
Common.ExportCSV("dominion", new File(export_path, "dominion.csv"));
Common.ExportCSV("dominion_group", new File(export_path, "dominion_group.csv"));
Common.ExportCSV("dominion_member", new File(export_path, "dominion_member.csv"));
Map<String, String> world_uid_map = Dominion.instance.getServer().getWorlds().stream().collect(HashMap::new, (m, w) -> m.put(w.getName(), w.getUID().toString()), HashMap::putAll);
YamlConfiguration world_uid = new YamlConfiguration();
for (Map.Entry<String, String> entry : world_uid_map.entrySet()) {
world_uid.set(entry.getKey(), entry.getValue());
}
try {
world_uid.save(new File(export_path, "world_uid_mapping.yml"));
} catch (Exception e) {
XLogger.err("Save world_uid_mapping.yml failed: %s", e.getMessage());
return;
}
Notification.info(sender, Translation.Commands_Operator_ExportDBSuccess);
Notification.info(sender, "Path: %s", export_path.getAbsolutePath());
});
}
public static void Import(CommandSender sender) {
Scheduler.runTaskAsync(() -> {
if (!export_path.exists()) {
Notification.error(sender, Translation.Commands_Operator_ImportDBFail);
return;
}
Notification.info(sender, Translation.Commands_Operator_ImportDBBegin);
Map<String, String> world_uid_map = Dominion.instance.getServer().getWorlds().stream().collect(HashMap::new, (m, w) -> m.put(w.getName(), w.getUID().toString()), HashMap::putAll);
File player_name_csv = new File(export_path, "player_name.csv");
File privilege_template_csv = new File(export_path, "privilege_template.csv");
File dominion_csv = new File(export_path, "dominion.csv");
File world_uid_mapping = new File(export_path, "world_uid_mapping.yml");
File dominion_group_csv = new File(export_path, "dominion_group.csv");
File dominion_member_csv = new File(export_path, "dominion_member.csv");
if (!player_name_csv.exists() || !privilege_template_csv.exists() || !dominion_csv.exists() || !world_uid_mapping.exists() || !dominion_group_csv.exists() || !dominion_member_csv.exists()) {
Notification.error(sender, Translation.Commands_Operator_ImportDBIncompleteFail);
return;
}
try {
String dominion_file_str = Files.readString(dominion_csv.toPath());
YamlConfiguration world_uid = YamlConfiguration.loadConfiguration(world_uid_mapping);
for (String key : world_uid.getKeys(false)) {
if (world_uid_map.containsKey(key)) {
String old_uid = world_uid.getString(key);
String new_uid = world_uid_map.get(key);
if (old_uid == null || new_uid == null) {
continue;
}
dominion_file_str = dominion_file_str.replace(old_uid, world_uid_map.get(key));
}
}
Files.writeString(dominion_csv.toPath(), dominion_file_str);
} catch (IOException e) {
XLogger.err("Import world_uid_mapping.yml failed: %s", e.getMessage());
return;
}
Common.ImportCSV("player_name", "id", player_name_csv);
Common.ImportCSV("privilege_template", "id", privilege_template_csv);
Common.ImportCSV("dominion", "id", dominion_csv);
Common.ImportCSV("dominion_group", "id", dominion_group_csv);
Common.ImportCSV("dominion_member", "id", dominion_member_csv);
Notification.info(sender, Translation.Commands_Operator_ImportDBSuccess);
Operator.reloadCache(sender, new String[0]);
});
}
} }

View File

@ -1,26 +1,22 @@
package cn.lunadeer.dominion.managers; package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.World;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.*;
import java.util.List;
import java.util.Map;
public class GroupLimit { public class GroupLimit {
private final YamlConfiguration config;
private YamlConfiguration config;
private final File file_path; private final File file_path;
private Integer min_y; private final Map<String, WorldSetting> world_limits = new HashMap<>();
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 Double price;
private Boolean only_xz; private Boolean only_xz;
private Double refund; private Double refund;
@ -28,93 +24,132 @@ public class GroupLimit {
public GroupLimit() { public GroupLimit() {
this.file_path = null; this.file_path = null;
this.config = new YamlConfiguration(); this.config = new YamlConfiguration();
WorldSetting defaultSetting = new WorldSetting("config.yml");
world_limits.put("default", defaultSetting);
} }
public GroupLimit(File filePath) { private GroupLimit(File filePath) {
this.file_path = filePath; this.file_path = filePath;
config = YamlConfiguration.loadConfiguration(this.file_path); config = YamlConfiguration.loadConfiguration(this.file_path);
setLimitMinY(config.getInt("MinY", -64)); WorldSetting defaultSetting = new WorldSetting(filePath.getName());
setLimitMaxY(config.getInt("MaxY", 320)); defaultSetting.min_y = config.getInt("MinY", -64);
if (getLimitMinY() >= getLimitMaxY()) { defaultSetting.max_y = config.getInt("MaxY", 320);
XLogger.err(Translation.Config_Check_GroupMinYError, this.file_path.getName()); if (config.contains("SizeX")) { // todo: should be removed in the future
setLimitMinY(-64); defaultSetting.size_max_x = config.getInt("SizeX", 128);
setLimitMaxY(320); defaultSetting.size_max_y = config.getInt("SizeY", 64);
defaultSetting.size_max_z = config.getInt("SizeZ", 128);
defaultSetting.size_min_x = 4;
defaultSetting.size_min_y = 4;
defaultSetting.size_min_z = 4;
} else {
defaultSetting.size_max_x = config.getInt("Size.MaxX", 128);
defaultSetting.size_max_y = config.getInt("Size.MaxY", 64);
defaultSetting.size_max_z = config.getInt("Size.MaxZ", 128);
defaultSetting.size_min_x = config.getInt("Size.MinX", 4);
defaultSetting.size_min_y = config.getInt("Size.MinY", 4);
defaultSetting.size_min_z = config.getInt("Size.MinZ", 4);
} }
setLimitSizeX(config.getInt("SizeX", 128)); defaultSetting.amount = config.getInt("Amount", 10);
if (getLimitSizeX() <= 4 && getLimitSizeX() != -1) { defaultSetting.depth = config.getInt("Depth", 3);
XLogger.err(Translation.Config_Check_GroupSizeXError, this.file_path.getName()); defaultSetting.vert = config.getBoolean("Vert", false);
setLimitSizeX(128); world_limits.put("default", defaultSetting);
ConfigurationSection worldSettings = config.getConfigurationSection("WorldSettings");
if (worldSettings != null) {
addWorldLimits(WorldSetting.load(filePath.getName() + ":WorldSettings", worldSettings));
} }
setLimitSizeY(config.getInt("SizeY", 64)); price = config.getDouble("Price", 10.0);
if (getLimitSizeY() <= 4 && getLimitSizeY() != -1) { only_xz = config.getBoolean("OnlyXZ", false);
XLogger.err(Translation.Config_Check_GroupSizeYError, this.file_path.getName()); refund = config.getDouble("Refund", 0.85);
setLimitSizeY(64); checkRules();
saveAll();
}
public Integer getLimitMinY(@Nullable World world) {
if (world == null || !world_limits.containsKey(world.getName())) {
return world_limits.get("default").min_y;
} else {
return world_limits.get(world.getName()).min_y;
} }
setLimitSizeZ(config.getInt("SizeZ", 128)); }
if (getLimitSizeZ() <= 4 && getLimitSizeZ() != -1) {
XLogger.err(Translation.Config_Check_GroupSizeZError, this.file_path.getName()); public Integer getLimitMaxY(@Nullable World world) {
setLimitSizeZ(128); if (world == null || !world_limits.containsKey(world.getName())) {
return world_limits.get("default").max_y;
} else {
return world_limits.get(world.getName()).max_y;
} }
setLimitAmount(config.getInt("Amount", 10)); }
if (getLimitAmount() <= 0 && getLimitAmount() != -1) {
XLogger.err(Translation.Config_Check_GroupAmountError, this.file_path.getName()); public Integer getLimitSizeMaxX(@Nullable World world) {
setLimitAmount(10); if (world == null || !world_limits.containsKey(world.getName())) {
return world_limits.get("default").size_max_x;
} else {
return world_limits.get(world.getName()).size_max_x;
} }
setLimitDepth(config.getInt("Depth", 3)); }
if (getLimitDepth() <= 0 && getLimitDepth() != -1) {
XLogger.err(Translation.Config_Check_GroupDepthError, this.file_path.getName()); public Integer getLimitSizeMaxY(@Nullable World world) {
setLimitDepth(3); if (world == null || !world_limits.containsKey(world.getName())) {
return world_limits.get("default").size_max_y;
} else {
return world_limits.get(world.getName()).size_max_y;
} }
setLimitVert(config.getBoolean("Vert", false)); }
setWorldBlackList(config.getStringList("WorldBlackList"));
setPrice(config.getDouble("Price", 10.0)); public Integer getLimitSizeMaxZ(@Nullable World world) {
if (getPrice() < 0.0) { if (world == null || !world_limits.containsKey(world.getName())) {
XLogger.err(Translation.Config_Check_GroupPriceError, this.file_path.getName()); return world_limits.get("default").size_max_z;
setPrice(10.0); } else {
return world_limits.get(world.getName()).size_max_z;
} }
setPriceOnlyXZ(config.getBoolean("OnlyXZ", false)); }
setRefundRatio(config.getDouble("Refund", 0.85));
if (getRefundRatio() < 0.0 || getRefundRatio() > 1.0) { public Integer getLimitSizeMinX(@Nullable World world) {
XLogger.err(Translation.Config_Check_GroupRefundError, this.file_path.getName()); if (world == null || !world_limits.containsKey(world.getName())) {
setRefundRatio(0.85); return world_limits.get("default").size_min_x;
} else {
return world_limits.get(world.getName()).size_min_x;
} }
save(); // 保存一次确保文件中的数据是合法的
} }
public Integer getLimitMinY() { public Integer getLimitSizeMinY(@Nullable World world) {
return min_y; if (world == null || !world_limits.containsKey(world.getName())) {
return world_limits.get("default").size_min_y;
} else {
return world_limits.get(world.getName()).size_min_y;
}
} }
public Integer getLimitMaxY() { public Integer getLimitSizeMinZ(@Nullable World world) {
return max_y; if (world == null || !world_limits.containsKey(world.getName())) {
return world_limits.get("default").size_min_z;
} else {
return world_limits.get(world.getName()).size_min_z;
}
} }
public Integer getLimitSizeX() { public Integer getLimitAmount(@Nullable World world) {
return size_x; if (world == null || !world_limits.containsKey(world.getName())) {
return world_limits.get("default").amount;
} else {
return world_limits.get(world.getName()).amount;
}
} }
public Integer getLimitSizeY() { public Integer getLimitDepth(@Nullable World world) {
return size_y; if (world == null || !world_limits.containsKey(world.getName())) {
return world_limits.get("default").depth;
} else {
return world_limits.get(world.getName()).depth;
}
} }
public Integer getLimitSizeZ() { public Boolean getLimitVert(@Nullable World world) {
return size_z; if (world == null || !world_limits.containsKey(world.getName())) {
} return world_limits.get("default").vert;
} else {
public Integer getLimitAmount() { return world_limits.get(world.getName()).vert;
return amount; }
}
public Integer getLimitDepth() {
return depth;
}
public Boolean getLimitVert() {
return vert;
}
public List<String> getWorldBlackList() {
return world_black_list;
} }
public Double getPrice() { public Double getPrice() {
@ -130,90 +165,110 @@ public class GroupLimit {
} }
public void setLimitMinY(Integer min_y) { public void setLimitMinY(Integer min_y, @Nullable World world) {
this.min_y = min_y; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("MinY", min_y); world_limits.get("default").min_y = min_y;
this.save(); } else {
world_limits.get(world.getName()).min_y = min_y;
}
} }
public void setLimitMaxY(Integer max_y) { public void setLimitMaxY(Integer max_y, @Nullable World world) {
this.max_y = max_y; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("MaxY", max_y); world_limits.get("default").max_y = max_y;
this.save(); } else {
world_limits.get(world.getName()).max_y = max_y;
}
} }
public void setLimitSizeX(Integer size_x) { public void setLimitSizeMaxX(Integer size_x, @Nullable World world) {
this.size_x = size_x; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("SizeX", size_x); world_limits.get("default").size_max_x = size_x;
this.save(); } else {
world_limits.get(world.getName()).size_max_x = size_x;
}
} }
public void setLimitSizeY(Integer size_y) { public void setLimitSizeMaxY(Integer size_y, @Nullable World world) {
this.size_y = size_y; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("SizeY", size_y); world_limits.get("default").size_max_y = size_y;
this.save(); } else {
world_limits.get(world.getName()).size_max_y = size_y;
}
} }
public void setLimitSizeZ(Integer size_z) { public void setLimitSizeMaxZ(Integer size_z, @Nullable World world) {
this.size_z = size_z; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("SizeZ", size_z); world_limits.get("default").size_max_z = size_z;
this.save(); } else {
world_limits.get(world.getName()).size_max_z = size_z;
}
} }
public void setLimitAmount(Integer amount) { public void setLimitSizeMinX(Integer size_x, @Nullable World world) {
this.amount = amount; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("Amount", amount); world_limits.get("default").size_min_x = size_x;
this.save(); } else {
world_limits.get(world.getName()).size_min_x = size_x;
}
} }
public void setLimitDepth(Integer depth) { public void setLimitSizeMinY(Integer size_y, @Nullable World world) {
this.depth = depth; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("Depth", depth); world_limits.get("default").size_min_y = size_y;
this.save(); } else {
world_limits.get(world.getName()).size_min_y = size_y;
}
} }
public void setLimitVert(Boolean vert) { public void setLimitSizeMinZ(Integer size_z, @Nullable World world) {
this.vert = vert; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("Vert", vert); world_limits.get("default").size_min_z = size_z;
this.save(); } else {
world_limits.get(world.getName()).size_min_z = size_z;
}
} }
public void setWorldBlackList(List<String> world_black_list) { public void setLimitAmount(Integer amount, @Nullable World world) {
this.world_black_list = world_black_list; if (world == null || !world_limits.containsKey(world.getName())) {
this.config.set("WorldBlackList", world_black_list); world_limits.get("default").amount = amount;
this.save(); } else {
world_limits.get(world.getName()).amount = amount;
}
}
public void setLimitDepth(Integer depth, @Nullable World world) {
if (world == null || !world_limits.containsKey(world.getName())) {
world_limits.get("default").depth = depth;
} else {
world_limits.get(world.getName()).depth = depth;
}
}
public void setLimitVert(Boolean vert, @Nullable World world) {
if (world == null || !world_limits.containsKey(world.getName())) {
world_limits.get("default").vert = vert;
} else {
world_limits.get(world.getName()).vert = vert;
}
} }
public void setPrice(Double price) { public void setPrice(Double price) {
this.price = price; this.price = price;
this.config.set("Price", price);
this.save();
} }
public void setPriceOnlyXZ(Boolean only_xz) { public void setPriceOnlyXZ(Boolean only_xz) {
this.only_xz = only_xz; this.only_xz = only_xz;
this.config.set("OnlyXZ", only_xz);
this.save();
} }
public void setRefundRatio(Double refund) { public void setRefundRatio(Double refund) {
this.refund = refund; this.refund = refund;
this.config.set("Refund", refund);
this.save();
} }
private void save() { public void addWorldLimits(Map<String, WorldSetting> limits) {
if (file_path == null) { world_limits.putAll(limits);
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) { public static Map<String, GroupLimit> loadGroups(JavaPlugin plugin) {
Map<String, GroupLimit> groups = new HashMap<>(); Map<String, GroupLimit> groups = new HashMap<>();
File root = plugin.getDataFolder(); File root = plugin.getDataFolder();
@ -238,4 +293,102 @@ public class GroupLimit {
XLogger.info(Translation.Messages_LoadedGroupAmount, groups.size()); XLogger.info(Translation.Messages_LoadedGroupAmount, groups.size());
return groups; return groups;
} }
private void saveAll() {
this.file_path.delete();
this.config = new YamlConfiguration();
this.config.set("MinY", world_limits.get("default").min_y);
this.config.setComments("MinY", Arrays.asList(
Translation.Config_Comment_GroupLine1.trans(),
Translation.Config_Comment_GroupLine2.trans(),
Translation.Config_Comment_GroupLine3.trans(),
Translation.Config_Comment_GroupLine4.trans(),
Translation.Config_Comment_GroupLine5.trans(),
Translation.Config_Comment_GroupLine6.trans(),
Translation.Config_Comment_GroupLine7.trans(),
String.format(Translation.Config_Comment_GroupLine8DocumentAddress.trans(), ConfigManager.instance.getLanguage())
));
this.config.setInlineComments("MinY", List.of(Translation.Config_Comment_MinY.trans()));
this.config.set("MaxY", world_limits.get("default").max_y);
this.config.setInlineComments("MaxY", List.of(Translation.Config_Comment_MaxY.trans()));
this.config.set("Size.MaxX", world_limits.get("default").size_max_x);
this.config.setInlineComments("Size.MaxX", List.of(Translation.Config_Comment_SizeMaxX.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
this.config.set("Size.MaxY", world_limits.get("default").size_max_y);
this.config.setInlineComments("Size.MaxY", List.of(Translation.Config_Comment_SizeMaxY.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
this.config.set("Size.MaxZ", world_limits.get("default").size_max_z);
this.config.setInlineComments("Size.MaxZ", List.of(Translation.Config_Comment_SizeMaxZ.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
this.config.set("Size.MinX", world_limits.get("default").size_min_x);
this.config.setInlineComments("Size.MinX", List.of(Translation.Config_Comment_SizeMinX.trans()));
this.config.set("Size.MinY", world_limits.get("default").size_min_y);
this.config.setInlineComments("Size.MinY", List.of(Translation.Config_Comment_SizeMinY.trans()));
this.config.set("Size.MinZ", world_limits.get("default").size_min_z);
this.config.setInlineComments("Size.MinZ", List.of(Translation.Config_Comment_SizeMinZ.trans()));
this.config.set("Amount", world_limits.get("default").amount);
this.config.setInlineComments("Amount", List.of(Translation.Config_Comment_Amount.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
this.config.set("Depth", world_limits.get("default").depth);
this.config.setInlineComments("Depth", List.of(Translation.Config_Comment_Depth.trans() + Translation.Config_Comment_ZeroDisabled.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
this.config.set("Vert", world_limits.get("default").vert);
this.config.setInlineComments("Vert", List.of(Translation.Config_Comment_Vert.trans()));
this.config.set("Price", price);
this.config.setInlineComments("Price", List.of(Translation.Config_Comment_Price.trans()));
this.config.set("OnlyXZ", only_xz);
this.config.setInlineComments("OnlyXZ", List.of(Translation.Config_Comment_OnlyXZ.trans()));
this.config.set("Refund", refund);
this.config.setInlineComments("Refund", List.of(Translation.Config_Comment_Refund.trans()));
this.config.set("WorldSettings", getWorldSettings());
this.config.setInlineComments("WorldSettings", List.of(Translation.Config_Comment_WorldSettings.trans()));
try {
this.config.save(this.file_path);
} catch (Exception e) {
XLogger.err("Failed to save group limit file: " + this.file_path.getName());
}
}
public YamlConfiguration getWorldSettings() {
YamlConfiguration section = new YamlConfiguration();
if (world_limits.size() <= 1) {
return WorldSetting.getDefaultList();
}
for (Map.Entry<String, WorldSetting> entry : world_limits.entrySet()) {
if (entry.getKey().equals("default")) {
continue;
}
section.set(entry.getKey(), entry.getValue().getYaml());
}
return section;
}
public void checkRules() {
if (getPrice() < 0.0) {
XLogger.err(Translation.Config_Check_GroupPriceError, this.file_path.getName());
setPrice(10.0);
}
if (getRefundRatio() < 0.0 || getRefundRatio() > 1.0) {
XLogger.err(Translation.Config_Check_GroupRefundError, this.file_path.getName());
setRefundRatio(0.85);
}
for (WorldSetting w : world_limits.values()) {
w.checkRules();
}
}
public List<String> getWorldBlackList() {
List<String> list = new ArrayList<>();
if (world_limits.getOrDefault("default", new WorldSetting("default")).amount == 0) {
list.addAll(Dominion.instance.getServer().getWorlds().stream().map(World::getName).toList());
}
for (Map.Entry<String, WorldSetting> entry : world_limits.entrySet()) {
if (entry.getKey().equals("default")) {
continue;
}
if (entry.getValue().amount == 0) {
list.add(entry.getKey());
} else {
list.remove(entry.getKey());
}
}
return list;
}
} }

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.managers; package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.GroupDTO; import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import me.clip.placeholderapi.expansion.PlaceholderExpansion; import me.clip.placeholderapi.expansion.PlaceholderExpansion;
@ -30,6 +31,13 @@ public class PlaceHolderApi extends PlaceholderExpansion {
} }
return group.getNameColoredBukkit(); return group.getNameColoredBukkit();
} }
if (params.equalsIgnoreCase("current_dominion")) {
DominionDTO dominion = Cache.instance.getDominionByLoc(bukkitPlayer.getLocation());
if (dominion == null) {
return "";
}
return dominion.getName();
}
return null; // return null; //
} }

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.managers; package cn.lunadeer.dominion.managers;
import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.minecraftpluginutils.i18n.Localization; import cn.lunadeer.minecraftpluginutils.i18n.Localization;
import cn.lunadeer.minecraftpluginutils.i18n.i18n; import cn.lunadeer.minecraftpluginutils.i18n.i18n;
import cn.lunadeer.minecraftpluginutils.i18n.i18nField; import cn.lunadeer.minecraftpluginutils.i18n.i18nField;
@ -147,31 +148,22 @@ public class Translation extends Localization {
public static i18n Commands_Operator_ReloadingConfig; public static i18n Commands_Operator_ReloadingConfig;
@i18nField(defaultValue = "配置文件已重新加载") @i18nField(defaultValue = "配置文件已重新加载")
public static i18n Commands_Operator_ReloadedConfig; public static i18n Commands_Operator_ReloadedConfig;
@i18nField(defaultValue = "你正在尝试导出数据库表,此行为会踢出所有玩家并关闭服务器,如确认继续请输入 /dominion export_db confirm")
@i18nField(defaultValue = "最高Y坐标限制不能小于最低Y坐标限制") public static i18n Commands_Operator_ExportDBConfirm;
public static i18n Commands_SetConfig_MinYShouldBeLessThanMaxY; @i18nField(defaultValue = "正在导出数据库表...")
@i18nField(defaultValue = "最低Y坐标限制不能大于最高Y坐标限制") public static i18n Commands_Operator_ExportDBBegin;
public static i18n Commands_SetConfig_MaxYShouldBeGreaterThanMinY; @i18nField(defaultValue = "数据库表导出完成")
@i18nField(defaultValue = "X轴(东西)最大尺寸不能小于4") public static i18n Commands_Operator_ExportDBSuccess;
public static i18n Commands_SetConfig_SizeXShouldBeGreaterThan4; @i18nField(defaultValue = "你正在尝试导入数据库表,此行为会踢出所有玩家并关闭服务器,如确认继续请输入 /dominion import_db confirm")
@i18nField(defaultValue = "Z轴(南北)最大尺寸不能小于4") public static i18n Commands_Operator_ImportDBConfirm;
public static i18n Commands_SetConfig_SizeZShouldBeGreaterThan4; @i18nField(defaultValue = "正在导入数据库表...")
@i18nField(defaultValue = "Y轴(垂直)最大尺寸不能小于4") public static i18n Commands_Operator_ImportDBBegin;
public static i18n Commands_SetConfig_SizeYShouldBeGreaterThan4; @i18nField(defaultValue = "数据库表导入完成")
@i18nField(defaultValue = "每个玩家领地数量限制不能小于0") public static i18n Commands_Operator_ImportDBSuccess;
public static i18n Commands_SetConfig_AmountShouldBeGreaterThan0; @i18nField(defaultValue = "没有可导入的数据")
@i18nField(defaultValue = "领地深度限制不能小于0") public static i18n Commands_Operator_ImportDBFail;
public static i18n Commands_SetConfig_DepthShouldBeGreaterThan0; @i18nField(defaultValue = "导入失败,数据不完整,请重新导出文件")
@i18nField(defaultValue = "传送延迟不能小于0") public static i18n Commands_Operator_ImportDBIncompleteFail;
public static i18n Commands_SetConfig_TpDelayShouldBeGreaterThan0;
@i18nField(defaultValue = "传送冷却时间不能小于0")
public static i18n Commands_SetConfig_TpCoolDownShouldBeGreaterThan0;
@i18nField(defaultValue = "每方块单价不能小于0")
public static i18n Commands_SetConfig_PriceShouldBeGreaterThan0;
@i18nField(defaultValue = "领地退款比例不能小于0")
public static i18n Commands_SetConfig_RefundShouldBeGreaterThan0;
@i18nField(defaultValue = "出生点保护半径不能小于或等于0")
public static i18n Commands_SetConfig_SpawnProtectRadiusShouldBeGreaterThan0;
@i18nField(defaultValue = "用法: /dominion template create <模板名称>") @i18nField(defaultValue = "用法: /dominion template create <模板名称>")
public static i18n Commands_Template_CreateTemplateUsage; public static i18n Commands_Template_CreateTemplateUsage;
@ -326,14 +318,18 @@ public class Translation extends Localization {
public static i18n Messages_SetMapColorSuccess; public static i18n Messages_SetMapColorSuccess;
@i18nField(defaultValue = "尺寸不合法") @i18nField(defaultValue = "尺寸不合法")
public static i18n Messages_SizeInvalid; public static i18n Messages_SizeInvalid;
@i18nField(defaultValue = "领地的任意一边长度不得小于4")
public static i18n Messages_SizeShouldBeGreaterThan4;
@i18nField(defaultValue = "领地X方向(东西)长度不能超过 %d") @i18nField(defaultValue = "领地X方向(东西)长度不能超过 %d")
public static i18n Messages_SizeXShouldBeLessThan; public static i18n Messages_SizeXShouldBeLessThan;
@i18nField(defaultValue = "领地Y方向(上下)高度不能超过 %d") @i18nField(defaultValue = "领地Y方向(上下)高度不能超过 %d")
public static i18n Messages_SizeYShouldBeLessThan; public static i18n Messages_SizeYShouldBeLessThan;
@i18nField(defaultValue = "领地Z方向(南北)长度不能超过 %d") @i18nField(defaultValue = "领地Z方向(南北)长度不能超过 %d")
public static i18n Messages_SizeZShouldBeLessThan; public static i18n Messages_SizeZShouldBeLessThan;
@i18nField(defaultValue = "领地X方向(东西)长度不能少于 %d")
public static i18n Messages_SizeXShouldBeGreaterThan;
@i18nField(defaultValue = "领地Y方向(上下)高度不能少于 %d")
public static i18n Messages_SizeYShouldBeGreaterThan;
@i18nField(defaultValue = "领地Z方向(南北)长度不能少于 %d")
public static i18n Messages_SizeZShouldBeGreaterThan;
@i18nField(defaultValue = "领地Y坐标上限不能超过 %d") @i18nField(defaultValue = "领地Y坐标上限不能超过 %d")
public static i18n Messages_MaxYShouldBeLessThan; public static i18n Messages_MaxYShouldBeLessThan;
@i18nField(defaultValue = "领地Y坐标下限不能超过 %d") @i18nField(defaultValue = "领地Y坐标下限不能超过 %d")
@ -375,6 +371,8 @@ public class Translation extends Localization {
public static i18n Messages_SetDominionFlagSuccess; public static i18n Messages_SetDominionFlagSuccess;
@i18nField(defaultValue = "未知的权限 %s") @i18nField(defaultValue = "未知的权限 %s")
public static i18n Messages_UnknownFlag; public static i18n Messages_UnknownFlag;
@i18nField(defaultValue = "你没有权限访问此页面")
public static i18n Messages_PageNoPermission;
@i18nField(defaultValue = "创建权限组 %s 失败") @i18nField(defaultValue = "创建权限组 %s 失败")
public static i18n Messages_CreateGroupFailed; public static i18n Messages_CreateGroupFailed;
@ -501,6 +499,8 @@ public class Translation extends Localization {
public static i18n Messages_PlaceholderAPIRegisterSuccess; public static i18n Messages_PlaceholderAPIRegisterSuccess;
@i18nField(defaultValue = "共加载了 %d 个领地组") @i18nField(defaultValue = "共加载了 %d 个领地组")
public static i18n Messages_LoadedGroupAmount; public static i18n Messages_LoadedGroupAmount;
@i18nField(defaultValue = "<div>%s</div><div>所有人:%s</div>")
public static i18n Messages_MapInfoDetail;
@i18nField(defaultValue = "开始自动清理长时间未登录玩家领地数据") @i18nField(defaultValue = "开始自动清理长时间未登录玩家领地数据")
public static i18n Messages_AutoCleanStart; public static i18n Messages_AutoCleanStart;
@ -516,6 +516,291 @@ public class Translation extends Localization {
@i18nField(defaultValue = "<>表示必填参数 []表示可选参数") @i18nField(defaultValue = "<>表示必填参数 []表示可选参数")
public static i18n TUI_CommandHelp_SubTitle; public static i18n TUI_CommandHelp_SubTitle;
@i18nField(defaultValue = "主菜单")
public static i18n TUI_Navigation_Menu;
@i18nField(defaultValue = "我的领地")
public static i18n TUI_Navigation_DominionList;
@i18nField(defaultValue = "管理界面")
public static i18n TUI_Navigation_Manage;
@i18nField(defaultValue = "环境设置")
public static i18n TUI_Navigation_EnvSetting;
@i18nField(defaultValue = "访客权限")
public static i18n TUI_Navigation_GuestSetting;
@i18nField(defaultValue = "成员列表")
public static i18n TUI_Navigation_MemberList;
@i18nField(defaultValue = "成员权限")
public static i18n TUI_Navigation_MemberSetting;
@i18nField(defaultValue = "权限组列表")
public static i18n TUI_Navigation_GroupList;
@i18nField(defaultValue = "权限组管理")
public static i18n TUI_Navigation_GroupSetting;
@i18nField(defaultValue = "所有领地")
public static i18n TUI_Navigation_AllDominion;
@i18nField(defaultValue = "模板列表")
public static i18n TUI_Navigation_TemplateList;
@i18nField(defaultValue = "模板管理")
public static i18n TUI_Navigation_TemplateSetting;
@i18nField(defaultValue = "Res数据列表")
public static i18n TUI_Navigation_MigrateList;
@i18nField(defaultValue = "权限组称号列表")
public static i18n TUI_Navigation_TitleList;
@i18nField(defaultValue = "管理")
public static i18n TUI_ManageButton;
@i18nField(defaultValue = "删除")
public static i18n TUI_DeleteButton;
@i18nField(defaultValue = "搜索")
public static i18n TUI_SearchButton;
@i18nField(defaultValue = "返回")
public static i18n TUI_BackButton;
@i18nField(defaultValue = "选择")
public static i18n TUI_SelectButton;
@i18nField(defaultValue = "编辑")
public static i18n TUI_EditButton;
@i18nField(defaultValue = "Dominion 领地系统")
public static i18n TUI_Menu_Title;
@i18nField(defaultValue = "创建领地")
public static i18n TUI_Menu_CreateDominionButton;
@i18nField(defaultValue = "以你为中心自动创建一个新的领地")
public static i18n TUI_Menu_CreateDominionDescription;
@i18nField(defaultValue = "我的领地")
public static i18n TUI_Menu_MyDominionButton;
@i18nField(defaultValue = "查看我的领地列表")
public static i18n TUI_Menu_MyDominionDescription;
@i18nField(defaultValue = "称号列表")
public static i18n TUI_Menu_TitleListButton;
@i18nField(defaultValue = "查看/使用权限组称号")
public static i18n TUI_Menu_TitleListDescription;
@i18nField(defaultValue = "模板列表")
public static i18n TUI_Menu_TemplateListButton;
@i18nField(defaultValue = "成员权限模板列表")
public static i18n TUI_Menu_TemplateListDescription;
@i18nField(defaultValue = "指令帮助")
public static i18n TUI_Menu_CommandHelpButton;
@i18nField(defaultValue = "查看指令列表")
public static i18n TUI_Menu_CommandHelpDescription;
@i18nField(defaultValue = "使用文档")
public static i18n TUI_Menu_DocumentButton;
@i18nField(defaultValue = "在浏览器中打开使用文档")
public static i18n TUI_Menu_DocumentDescription;
@i18nField(defaultValue = "迁移数据")
public static i18n TUI_Menu_MigrateButton;
@i18nField(defaultValue = "把你的领地从Residence迁移到Dominion")
public static i18n TUI_Menu_MigrateDescription;
@i18nField(defaultValue = "所有领地")
public static i18n TUI_Menu_AllDominionButton;
@i18nField(defaultValue = "查看所有领地")
public static i18n TUI_Menu_AllDominionDescription;
@i18nField(defaultValue = "重载缓存")
public static i18n TUI_Menu_ReloadCacheButton;
@i18nField(defaultValue = "手动刷新缓存可解决一些玩家操作无效问题,不建议频繁操作")
public static i18n TUI_Menu_ReloadCacheDescription;
@i18nField(defaultValue = "重载配置")
public static i18n TUI_Menu_ReloadConfigButton;
@i18nField(defaultValue = "重载配置文件")
public static i18n TUI_Menu_ReloadConfigDescription;
@i18nField(defaultValue = "--- 以下选项仅OP可见 ---")
public static i18n TUI_Menu_OpOnlySection;
@i18nField(defaultValue = "我的领地列表")
public static i18n TUI_DominionList_Title;
@i18nField(defaultValue = "--- 以下为你拥有管理员权限的领地 ---")
public static i18n TUI_DominionList_AdminSection;
@i18nField(defaultValue = "领地 %s 管理界面")
public static i18n TUI_DominionManage_Title;
@i18nField(defaultValue = "详细信息")
public static i18n TUI_DominionManage_InfoButton;
@i18nField(defaultValue = "查看领地详细信息")
public static i18n TUI_DominionManage_InfoDescription;
@i18nField(defaultValue = "环境设置")
public static i18n TUI_DominionManage_EnvSettingButton;
@i18nField(defaultValue = "设置领地内的一些环境行为")
public static i18n TUI_DominionManage_EnvSettingDescription;
@i18nField(defaultValue = "访客权限")
public static i18n TUI_DominionManage_GuestSettingButton;
@i18nField(defaultValue = "配置访客在此领地的权限")
public static i18n TUI_DominionManage_GuestSettingDescription;
@i18nField(defaultValue = "成员管理")
public static i18n TUI_DominionManage_MemberListButton;
@i18nField(defaultValue = "管理此领地成员的权限")
public static i18n TUI_DominionManage_MemberListDescription;
@i18nField(defaultValue = "权限组")
public static i18n TUI_DominionManage_GroupListButton;
@i18nField(defaultValue = "管理此领地的权限组")
public static i18n TUI_DominionManage_GroupListDescription;
@i18nField(defaultValue = "设置传送点")
public static i18n TUI_DominionManage_SetTpLocationButton;
@i18nField(defaultValue = "设置你当前位置为此领地传送点")
public static i18n TUI_DominionManage_SetTpLocationDescription;
@i18nField(defaultValue = "重命名")
public static i18n TUI_DominionManage_RenameButton;
@i18nField(defaultValue = "重命名领地")
public static i18n TUI_DominionManage_RenameDescription;
@i18nField(defaultValue = "编辑欢迎提示语")
public static i18n TUI_DominionManage_EditJoinMessageButton;
@i18nField(defaultValue = "当玩家进入领地时显示的消息")
public static i18n TUI_DominionManage_EditJoinMessageDescription;
@i18nField(defaultValue = "编辑离开提示语")
public static i18n TUI_DominionManage_EditLeaveMessageButton;
@i18nField(defaultValue = "当玩家离开领地时显示的消息")
public static i18n TUI_DominionManage_EditLeaveMessageDescription;
@i18nField(defaultValue = "设置地块颜色")
public static i18n TUI_DominionManage_SetMapColorButton;
@i18nField(defaultValue = "设置卫星地图上的地块颜色")
public static i18n TUI_DominionManage_SetMapColorDescription;
@i18nField(defaultValue = "你不在任何领地内,请指定领地名称 /dominion manage <领地名称>")
public static i18n TUI_DominionManage_NotInDominion;
@i18nField(defaultValue = "领地 %s 环境设置")
public static i18n TUI_EnvSetting_Title;
@i18nField(defaultValue = "用法: /dominion env_setting <领地名称> [页码]")
public static i18n TUI_EnvSetting_Usage;
@i18nField(defaultValue = "领地 %s 访客权限")
public static i18n TUI_GuestSetting_Title;
@i18nField(defaultValue = "用法: /dominion guest_setting <领地名称> [页码]")
public static i18n TUI_GuestSetting_Usage;
@i18nField(defaultValue = "领地 %s 的尺寸信息")
public static i18n TUI_SizeInfo_Title;
@i18nField(defaultValue = "领地所有者:")
public static i18n TUI_SizeInfo_Owner;
@i18nField(defaultValue = "领地大小:")
public static i18n TUI_SizeInfo_Size;
@i18nField(defaultValue = "中心坐标:")
public static i18n TUI_SizeInfo_Center;
@i18nField(defaultValue = "垂直高度:")
public static i18n TUI_SizeInfo_Vertical;
@i18nField(defaultValue = "Y轴坐标")
public static i18n TUI_SizeInfo_VertY;
@i18nField(defaultValue = "水平面积:")
public static i18n TUI_SizeInfo_Square;
@i18nField(defaultValue = "领地体积:")
public static i18n TUI_SizeInfo_Volume;
@i18nField(defaultValue = "传送点坐标:")
public static i18n TUI_SizeInfo_TpLocation;
@i18nField(defaultValue = "")
public static i18n TUI_SizeInfo_NoneTp;
@i18nField(defaultValue = "你不在任何领地内,请指定领地名称 /dominion info <领地名称>")
public static i18n TUI_SizeInfo_Usage;
@i18nField(defaultValue = "领地 %s 成员列表")
public static i18n TUI_MemberList_Title;
@i18nField(defaultValue = "添加成员")
public static i18n TUI_MemberList_AddButton;
@i18nField(defaultValue = "权限")
public static i18n TUI_MemberList_FlagButton;
@i18nField(defaultValue = "配置成员权限")
public static i18n TUI_MemberList_FlagDescription;
@i18nField(defaultValue = "移除")
public static i18n TUI_MemberList_RemoveButton;
@i18nField(defaultValue = "将此成员移出(变为访客)")
public static i18n TUI_MemberList_RemoveDescription;
@i18nField(defaultValue = "你不是领地主人,无法编辑管理员权限")
public static i18n TUI_MemberList_NoPermissionSet;
@i18nField(defaultValue = "你不是领地主人,无法移除管理员")
public static i18n TUI_MemberList_NoPermissionRemove;
@i18nField(defaultValue = "此成员属于权限组 %s 无法单独编辑权限")
public static i18n TUI_MemberList_BelongToGroup;
@i18nField(defaultValue = "用法: /dominion member list <领地名称> [页码]")
public static i18n TUI_MemberList_Usage;
@i18nField(defaultValue = "这是一个管理员")
public static i18n TUI_MemberList_AdminTag;
@i18nField(defaultValue = "这是一个普通成员")
public static i18n TUI_MemberList_NormalTag;
@i18nField(defaultValue = "这是一个黑名单成员")
public static i18n TUI_MemberList_BlacklistTag;
@i18nField(defaultValue = "这个成员在一个权限组里")
public static i18n TUI_MemberList_GroupTag;
@i18nField(defaultValue = "玩家 %s 在领地 %s 的权限设置")
public static i18n TUI_MemberSetting_Title;
@i18nField(defaultValue = "套用模板")
public static i18n TUI_MemberSetting_ApplyTemplateButton;
@i18nField(defaultValue = "选择一个权限模板套用")
public static i18n TUI_MemberSetting_ApplyTemplateDescription;
@i18nField(defaultValue = "用法: /dominion member setting <领地名称> <玩家名称> [页码]")
public static i18n TUI_MemberSetting_Usage;
@i18nField(defaultValue = "选择玩家添加为成员")
public static i18n TUI_SelectPlayer_Title;
@i18nField(defaultValue = "只能选择已经登录过的玩家")
public static i18n TUI_SelectPlayer_Description;
@i18nField(defaultValue = "用法: /dominion member select_player <领地名称> [页码]")
public static i18n TUI_SelectPlayer_Usage;
@i18nField(defaultValue = "选择一个模板")
public static i18n TUI_SelectTemplate_Title;
@i18nField(defaultValue = "套用在领地 %s 的成员 %s 身上")
public static i18n TUI_SelectTemplate_Description;
@i18nField(defaultValue = "用法: /dominion member select_template <领地名称> <玩家名称> [页码]")
public static i18n TUI_SelectTemplate_Usage;
@i18nField(defaultValue = "领地 %s 权限组列表")
public static i18n TUI_GroupList_Title;
@i18nField(defaultValue = "创建权限组")
public static i18n TUI_GroupList_CreateButton;
@i18nField(defaultValue = "创建一个新的权限组")
public static i18n TUI_GroupList_CreateDescription;
@i18nField(defaultValue = "删除权限组 %s")
public static i18n TUI_GroupList_DeleteDescription;
@i18nField(defaultValue = "编辑权限组 %s")
public static i18n TUI_GroupList_EditDescription;
@i18nField(defaultValue = "添加成员到权限组 %s")
public static i18n TUI_GroupList_AddMemberDescription;
@i18nField(defaultValue = "把 %s 移出权限组 %s")
public static i18n TUI_GroupList_RemoveMemberDescription;
@i18nField(defaultValue = "用法: /dominion group list <领地名称> [页码]")
public static i18n TUI_GroupList_Usage;
@i18nField(defaultValue = "重命名此权限组")
public static i18n TUI_GroupSetting_RenameButton;
@i18nField(defaultValue = "用法: /dominion group setting <领地名称> <权限组名称> [页码]")
public static i18n TUI_GroupSetting_Usage;
@i18nField(defaultValue = "权限组 ")
public static i18n TUI_GroupSetting_TitleL;
@i18nField(defaultValue = " 管理")
public static i18n TUI_GroupSetting_TitleR;
@i18nField(defaultValue = "重命名权限组 %s")
public static i18n TUI_GroupSetting_RenameDescription;
@i18nField(defaultValue = "选择成员")
public static i18n TUI_SelectMember_Title;
@i18nField(defaultValue = "选择成员添加到权限组 %s")
public static i18n TUI_SelectMember_Description;
@i18nField(defaultValue = "用法: /dominion group select_member <领地名称> <权限组名称> [回显页码] [页码]")
public static i18n TUI_SelectMember_Usage;
@i18nField(defaultValue = "成员权限模板列表")
public static i18n TUI_TemplateList_Title;
@i18nField(defaultValue = "创建成员权限模板")
public static i18n TUI_TemplateList_CreateButton;
@i18nField(defaultValue = "创建一个新的成员权限模板")
public static i18n TUI_TemplateList_CreateDescription;
@i18nField(defaultValue = "模板 %s 权限管理")
public static i18n TUI_TemplateSetting_Title;
@i18nField(defaultValue = "从 Residence 迁移数据")
public static i18n TUI_Migrate_Title;
@i18nField(defaultValue = "你没有可迁移的数据")
public static i18n TUI_Migrate_NoData;
@i18nField(defaultValue = "迁移")
public static i18n TUI_Migrate_Button;
@i18nField(defaultValue = "子领地无法手动迁移,会随父领地自动迁移")
public static i18n TUI_Migrate_SubDominion;
@i18nField(defaultValue = "我可使用的权限组称号")
public static i18n TUI_TitleList_Title;
@i18nField(defaultValue = "卸下")
public static i18n TUI_TitleList_RemoveButton;
@i18nField(defaultValue = "使用")
public static i18n TUI_TitleList_ApplyButton;
@i18nField(defaultValue = "来自领地:")
public static i18n TUI_TitleList_FromDominion;
@i18nField(defaultValue = "输入要创建的领地名称") @i18nField(defaultValue = "输入要创建的领地名称")
public static i18n CUI_Input_CreateDominion; public static i18n CUI_Input_CreateDominion;
@i18nField(defaultValue = "输入要创建的权限组名称") @i18nField(defaultValue = "输入要创建的权限组名称")
@ -537,49 +822,63 @@ public class Translation extends Localization {
@i18nField(defaultValue = "AutoCreateRadius 不能等于 0已重置为 10") @i18nField(defaultValue = "AutoCreateRadius 不能等于 0已重置为 10")
public static i18n Config_Check_AutoCreateRadiusError; public static i18n Config_Check_AutoCreateRadiusError;
@i18nField(defaultValue = "MessageDisplay 不能设置为 %s已重置为 ACTION_BAR")
public static i18n Config_Check_MessageDisplayError;
@i18nField(defaultValue = "AutoCleanAfterDays 不能等于 0已重置为 180") @i18nField(defaultValue = "AutoCleanAfterDays 不能等于 0已重置为 180")
public static i18n Config_Check_AutoCleanAfterDaysError; public static i18n Config_Check_AutoCleanAfterDaysError;
@i18nField(defaultValue = "工具名称设置错误,已重置为 ARROW") @i18nField(defaultValue = "Tool 名称设置错误,已重置为 ARROW")
public static i18n Config_Check_ToolNameError; public static i18n Config_Check_ToolNameError;
@i18nField(defaultValue = "Limit.SizeX 尺寸不能小于 4已重置为 128") @i18nField(defaultValue = "InfoTool 名称设置错误,已重置为 STRING")
public static i18n Config_Check_LimitSizeXError; public static i18n Config_Check_InfoToolNameError;
@i18nField(defaultValue = "Limit.SizeY 尺寸不能小于 4已重置为 64") @i18nField(defaultValue = "%s 的 MinY 不能大于等于 MaxY已重置为 -64 和 320")
public static i18n Config_Check_LimitSizeYError;
@i18nField(defaultValue = "Limit.SizeZ 尺寸不能小于 4已重置为 128")
public static i18n Config_Check_LimitSizeZError;
@i18nField(defaultValue = "Limit.MinY 不能大于或等于 Limit.MaxY已重置为 -64 320")
public static i18n Config_Check_LimitMinYError;
@i18nField(defaultValue = "Economy.Refund 设置不合法,已重置为 0.85")
public static i18n Config_Check_RefundError;
@i18nField(defaultValue = "Economy.Price 设置不合法,已重置为 10.0")
public static i18n Config_Check_PriceError;
@i18nField(defaultValue = "启用 Limit.Vert 时 Limit.SizeY 不能小于 Limit.MaxY - Limit.MinY已自动调整为 %d")
public static i18n Config_Check_LimitSizeYAutoAdjust;
@i18nField(defaultValue = "Limit.Amount 设置不合法,已重置为 10")
public static i18n Config_Check_AmountError;
@i18nField(defaultValue = "Limit.Depth 设置不合法,已重置为 3")
public static i18n Config_Check_DepthError;
@i18nField(defaultValue = "权限组 %s 的 MinY 不能大于等于 MaxY已重置为 -64 和 320")
public static i18n Config_Check_GroupMinYError; public static i18n Config_Check_GroupMinYError;
@i18nField(defaultValue = "权限组 %s 的 SizeX 设置过小,已重置为 128") @i18nField(defaultValue = "%s 的 Size.MaxX 设置过小,已重置为 128")
public static i18n Config_Check_GroupSizeXError; public static i18n Config_Check_GroupSizeMaxXError;
@i18nField(defaultValue = "权限组 %s 的 SizeY 设置过小,已重置为 64") @i18nField(defaultValue = "%s 的 Size.MaxY 设置过小,已重置为 64")
public static i18n Config_Check_GroupSizeYError; public static i18n Config_Check_GroupSizeMaxYError;
@i18nField(defaultValue = "权限组 %s 的 SizeZ 设置过小,已重置为 128") @i18nField(defaultValue = "%s 的 Size.MaxZ 设置过小,已重置为 128")
public static i18n Config_Check_GroupSizeZError; public static i18n Config_Check_GroupSizeMaxZError;
@i18nField(defaultValue = "权限组 %s 的 Amount 设置不合法,已重置为 10") @i18nField(defaultValue = "%s 的 Size.MinX 设置过小,已重置为 4")
public static i18n Config_Check_GroupSizeMinXError;
@i18nField(defaultValue = "%s 的 Size.MinY 设置过小,已重置为 4")
public static i18n Config_Check_GroupSizeMinYError;
@i18nField(defaultValue = "%s 的 Size.MinZ 设置过小,已重置为 4")
public static i18n Config_Check_GroupSizeMinZError;
@i18nField(defaultValue = "%s 的 Size.MaxX 不能小于 MinX已重置为 128 和 4")
public static i18n Config_Check_GroupMaxMinXError;
@i18nField(defaultValue = "%s 的 Size.MinY 不能小于 MinY已重置为 64 和 4")
public static i18n Config_Check_GroupMaxMinYError;
@i18nField(defaultValue = "%s 的 Size.MaxZ 不能小于 MinZ已重置为 128 和 4")
public static i18n Config_Check_GroupMaxMinZError;
@i18nField(defaultValue = "%s 的 Amount 设置不合法,已重置为 10")
public static i18n Config_Check_GroupAmountError; public static i18n Config_Check_GroupAmountError;
@i18nField(defaultValue = "权限组 %s 的 Depth 设置不合法,已重置为 3") @i18nField(defaultValue = "%s 的 Depth 设置不合法,已重置为 3")
public static i18n Config_Check_GroupDepthError; public static i18n Config_Check_GroupDepthError;
@i18nField(defaultValue = "权限组 %s 的 Price 设置不合法,已重置为 10.0") @i18nField(defaultValue = "%s 的 Price 设置不合法,已重置为 10.0")
public static i18n Config_Check_GroupPriceError; public static i18n Config_Check_GroupPriceError;
@i18nField(defaultValue = "权限组 %s 的 Refund 设置不合法,已重置为 0.85") @i18nField(defaultValue = "%s 的 Refund 设置不合法,已重置为 0.85")
public static i18n Config_Check_GroupRefundError; public static i18n Config_Check_GroupRefundError;
@i18nField(defaultValue = "读取权限配置失败:%s")
public static i18n Config_Check_LoadFlagError;
@i18nField(defaultValue = "传送延迟不能小于 0已重置为 0")
public static i18n Config_Check_TpDelayError;
@i18nField(defaultValue = "传送冷却不能小于 0已重置为 0")
public static i18n Config_Check_TpCoolDownError;
@i18nField(defaultValue = "语言设置,参考 languages 文件夹下的文件名") @i18nField(defaultValue = "语言设置,参考 languages 文件夹下的文件名")
public static i18n Config_Comment_Language; public static i18n Config_Comment_Language;
@i18nField(defaultValue = "自动创建领地的半径,单位为方块") @i18nField(defaultValue = "自动创建领地的半径,单位为方块")
public static i18n Config_Comment_AutoCreateRadius; public static i18n Config_Comment_AutoCreateRadius;
@i18nField(defaultValue = "默认进入领地提示消息")
public static i18n Config_Comment_DefaultJoinMessage;
@i18nField(defaultValue = "默认离开领地提示消息")
public static i18n Config_Comment_DefaultLeaveMessage;
@i18nField(defaultValue = "提示消息显示位置BOSS_BAR, ACTION_BAR, TITLE, SUBTITLE, CHAT")
public static i18n Config_Comment_MessageDisplay;
@i18nField(defaultValue = "玩家没有权限时的提示消息位置")
public static i18n Config_Comment_MessageDisplayNoPermission;
@i18nField(defaultValue = "进入/离开领地时的提示消息位置")
public static i18n Config_Comment_MessageDisplayJoinLeave;
@i18nField(defaultValue = "-1表示不开启") @i18nField(defaultValue = "-1表示不开启")
public static i18n Config_Comment_NegativeOneDisabled; public static i18n Config_Comment_NegativeOneDisabled;
@i18nField(defaultValue = "默认玩家圈地限制") @i18nField(defaultValue = "默认玩家圈地限制")
@ -593,11 +892,17 @@ public class Translation extends Localization {
@i18nField(defaultValue = "-1表示不限制") @i18nField(defaultValue = "-1表示不限制")
public static i18n Config_Comment_NegativeOneUnlimited; public static i18n Config_Comment_NegativeOneUnlimited;
@i18nField(defaultValue = "X方向最大长度") @i18nField(defaultValue = "X方向最大长度")
public static i18n Config_Comment_SizeX; public static i18n Config_Comment_SizeMaxX;
@i18nField(defaultValue = "Y方向最大长度") @i18nField(defaultValue = "Y方向最大长度")
public static i18n Config_Comment_SizeY; public static i18n Config_Comment_SizeMaxY;
@i18nField(defaultValue = "Z方向最大长度") @i18nField(defaultValue = "Z方向最大长度")
public static i18n Config_Comment_SizeZ; public static i18n Config_Comment_SizeMaxZ;
@i18nField(defaultValue = "X方向最小长度")
public static i18n Config_Comment_SizeMinX;
@i18nField(defaultValue = "Y方向最小长度")
public static i18n Config_Comment_SizeMinY;
@i18nField(defaultValue = "Z方向最小长度")
public static i18n Config_Comment_SizeMinZ;
@i18nField(defaultValue = "最大领地数量") @i18nField(defaultValue = "最大领地数量")
public static i18n Config_Comment_Amount; public static i18n Config_Comment_Amount;
@i18nField(defaultValue = "子领地深度") @i18nField(defaultValue = "子领地深度")
@ -606,10 +911,10 @@ public class Translation extends Localization {
public static i18n Config_Comment_ZeroDisabled; public static i18n Config_Comment_ZeroDisabled;
@i18nField(defaultValue = "是否自动延伸到 MaxY 和 MinY") @i18nField(defaultValue = "是否自动延伸到 MaxY 和 MinY")
public static i18n Config_Comment_Vert; public static i18n Config_Comment_Vert;
@i18nField(defaultValue = "不允许圈地的世界列表")
public static i18n Config_Comment_DisabledWorlds;
@i18nField(defaultValue = "是否允许OP无视领地限制") @i18nField(defaultValue = "是否允许OP无视领地限制")
public static i18n Config_Comment_OpBypass; public static i18n Config_Comment_OpBypass;
@i18nField(defaultValue = "单独设置某个世界的圈地规则(如不设置则使用以上规则)")
public static i18n Config_Comment_WorldSettings;
@i18nField(defaultValue = "传送延迟 秒") @i18nField(defaultValue = "传送延迟 秒")
public static i18n Config_Comment_TpDelay; public static i18n Config_Comment_TpDelay;
@i18nField(defaultValue = "传送冷却 秒") @i18nField(defaultValue = "传送冷却 秒")
@ -618,6 +923,8 @@ public class Translation extends Localization {
public static i18n Config_Comment_AutoCleanAfterDays; public static i18n Config_Comment_AutoCleanAfterDays;
@i18nField(defaultValue = "圈地工具名称") @i18nField(defaultValue = "圈地工具名称")
public static i18n Config_Comment_ToolName; public static i18n Config_Comment_ToolName;
@i18nField(defaultValue = "查询领地信息工具名称")
public static i18n Config_Comment_InfoToolName;
@i18nField(defaultValue = "经济设置") @i18nField(defaultValue = "经济设置")
public static i18n Config_Comment_Economy; public static i18n Config_Comment_Economy;
@i18nField(defaultValue = "需要安装 Vault 前置及插件") @i18nField(defaultValue = "需要安装 Vault 前置及插件")
@ -640,9 +947,78 @@ public class Translation extends Localization {
public static i18n Config_Comment_GroupTitleColor; public static i18n Config_Comment_GroupTitleColor;
@i18nField(defaultValue = "性能测试计时器") @i18nField(defaultValue = "性能测试计时器")
public static i18n Config_Comment_PerformanceTimer; public static i18n Config_Comment_PerformanceTimer;
@i18nField(defaultValue = ">---------------------------------<")
public static i18n Config_Comment_GroupLine1;
@i18nField(defaultValue = "| 圈地限制特殊权限组配置 |")
public static i18n Config_Comment_GroupLine2;
@i18nField(defaultValue = ">---------------------------------<")
public static i18n Config_Comment_GroupLine3;
@i18nField(defaultValue = "此文件可以作为模板,你可以将此文件复制后重命名为你想要的")
public static i18n Config_Comment_GroupLine4;
@i18nField(defaultValue = "权限组名然后修改里面的配置如果你想给赞助玩家或者VIP")
public static i18n Config_Comment_GroupLine5;
@i18nField(defaultValue = "一些特殊优惠,例如更少的圈地价格、更大的领地等,你可以在")
public static i18n Config_Comment_GroupLine6;
@i18nField(defaultValue = "这里配置。详细说明参阅以下链接:")
public static i18n Config_Comment_GroupLine7;
@i18nField(defaultValue = "> https://dominion.lunadeer.cn/%s/operator/privilege.html")
public static i18n Config_Comment_GroupLine8DocumentAddress;
@i18nField(defaultValue = "管理员")
public static i18n Flags_admin_DisplayName;
@i18nField(defaultValue = "管理领地内的其他成员权限")
public static i18n Flags_admin_Description;
@i18nField(defaultValue = "已选择第一个点: %d %d %d")
public static i18n Tool_SelectFirstPoint;
@i18nField(defaultValue = "已选择第二个点: %d %d %d")
public static i18n Tool_SelectSecondPoint;
@i18nField(defaultValue = "两个点不在同一个世界")
public static i18n Tool_NotSameWorld;
@i18nField(defaultValue = "已选择两个点,可以使用 /dominion create <领地名称> 创建领地")
public static i18n Tool_SelectTwoPoints;
@i18nField(defaultValue = "预计领地创建价格为 %.2f %s")
public static i18n Tool_CreateDominionPrice;
@i18nField(defaultValue = "尺寸: %d x %d x %d")
public static i18n Tool_DominionSize;
@i18nField(defaultValue = "面积: %d")
public static i18n Tool_DominionSquare;
@i18nField(defaultValue = "体积: %d")
public static i18n Tool_DominionVolume;
@i18nField(defaultValue = "高度: %d")
public static i18n Tool_DominionHeight;
@i18nField(defaultValue = "这个方块(%d, %d, %d)不在任何领地内")
public static i18n Tool_LocationNotInDominion;
@i18nField(defaultValue = "这个方块(%d, %d, %d)在领地 %s 内")
public static i18n Tool_LocationInDominion;
@i18nField(defaultValue = "领地主人: %s")
public static i18n Tool_DominionOwner;
public Translation(JavaPlugin plugin) { public Translation(JavaPlugin plugin) {
super(plugin); super(plugin);
} }
public void loadOrSetFlagTranslation(Flag flag) {
String displayNameTranslation = loadOrSet(flag.getDisplayNameKey(), flag.getDisplayName());
String descriptionTranslation = loadOrSet(flag.getDescriptionKey(), flag.getDescription());
flag.setDisplayName(displayNameTranslation);
flag.setDescription(descriptionTranslation);
}
public void saveFlagTranslation(Flag flag) {
set(flag.getDisplayNameKey(), flag.getDisplayName());
set(flag.getDescriptionKey(), flag.getDescription());
}
public void loadFlagTranslation(Flag flag) {
String displayNameTranslation = load(flag.getDisplayNameKey());
if (displayNameTranslation != null) {
flag.setDisplayName(displayNameTranslation);
}
String descriptionTranslation = load(flag.getDescriptionKey());
if (descriptionTranslation != null) {
flag.setDescription(descriptionTranslation);
}
}
} }

View File

@ -0,0 +1,150 @@
package cn.lunadeer.dominion.managers;
import cn.lunadeer.minecraftpluginutils.XLogger;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.util.Map;
public class WorldSetting {
public Integer min_y;
public Integer max_y;
public Integer size_max_x;
public Integer size_max_y;
public Integer size_max_z;
public Integer size_min_x;
public Integer size_min_y;
public Integer size_min_z;
public Integer amount;
public Integer depth;
public Boolean vert;
private final String sourceName;
/**
* 生成默认设置
*
* @return 设置内容
*/
public static YamlConfiguration getDefaultList() {
YamlConfiguration section = new YamlConfiguration();
section.set("some_world_name.MinY", -64);
section.set("some_world_name.MaxY", 320);
section.set("some_world_name.Size.MaxX", 128);
section.set("some_world_name.Size.MaxY", 64);
section.set("some_world_name.Size.MaxZ", 128);
section.set("some_world_name.Size.MinX", 4);
section.set("some_world_name.Size.MinY", 4);
section.set("some_world_name.Size.MinZ", 4);
section.set("some_world_name.Amount", 10);
section.set("some_world_name.Depth", 3);
section.set("some_world_name.Vert", false);
return section;
}
public WorldSetting(String sourceName) {
this.sourceName = sourceName;
}
public static Map<String, WorldSetting> load(String sourceName, ConfigurationSection worldSettings) {
Map<String, WorldSetting> world_limits = new java.util.HashMap<>();
for (String worldName : worldSettings.getKeys(false)) {
WorldSetting setting = new WorldSetting(sourceName);
setting.min_y = worldSettings.getInt(worldName + ".MinY", -64);
setting.max_y = worldSettings.getInt(worldName + ".MaxY", 320);
if (worldSettings.contains(worldName + ".SizeX")) { // todo: should be removed in the future
setting.size_max_x = worldSettings.getInt(worldName + ".SizeX", 128);
setting.size_max_y = worldSettings.getInt(worldName + ".SizeY", 64);
setting.size_max_z = worldSettings.getInt(worldName + ".SizeZ", 128);
setting.size_min_x = 4;
setting.size_min_y = 4;
setting.size_min_z = 4;
} else {
setting.size_max_x = worldSettings.getInt(worldName + ".Size.MaxX", 128);
setting.size_max_y = worldSettings.getInt(worldName + ".Size.MaxY", 64);
setting.size_max_z = worldSettings.getInt(worldName + ".Size.MaxZ", 128);
setting.size_min_x = worldSettings.getInt(worldName + ".Size.MinX", 4);
setting.size_min_y = worldSettings.getInt(worldName + ".Size.MinY", 4);
setting.size_min_z = worldSettings.getInt(worldName + ".Size.MinZ", 4);
}
setting.amount = worldSettings.getInt(worldName + ".Amount", 10);
setting.depth = worldSettings.getInt(worldName + ".Depth", 3);
setting.vert = worldSettings.getBoolean(worldName + ".Vert", false);
if (worldSettings.contains(worldName + ".Allow") && !worldSettings.getBoolean(worldName + ".Allow")) {
setting.amount = 0;
}
world_limits.put(worldName, setting);
}
return world_limits;
}
public YamlConfiguration getYaml() {
YamlConfiguration section = new YamlConfiguration();
section.set("MinY", min_y);
section.set("MaxY", max_y);
section.set("Size.MaxX", size_max_x);
section.set("Size.MaxY", size_max_y);
section.set("Size.MaxZ", size_max_z);
section.set("Size.MinX", size_min_x);
section.set("Size.MinY", size_min_y);
section.set("Size.MinZ", size_min_z);
section.set("Amount", amount);
section.set("Depth", depth);
section.set("Vert", vert);
return section;
}
public void checkRules() {
if (min_y > max_y) {
XLogger.err(Translation.Config_Check_GroupMinYError, sourceName);
min_y = -64;
max_y = 320;
}
if (size_max_x <= 4 && size_max_x != -1) {
XLogger.err(Translation.Config_Check_GroupSizeMaxXError, sourceName);
size_max_x = 128;
}
if (size_max_y <= 4 && size_max_y != -1) {
XLogger.err(Translation.Config_Check_GroupSizeMaxYError, sourceName);
size_max_y = 64;
}
if (size_max_z <= 4 && size_max_z != -1) {
XLogger.err(Translation.Config_Check_GroupSizeMaxZError, sourceName);
size_max_z = 128;
}
if (size_min_x <= 0) {
XLogger.err(Translation.Config_Check_GroupSizeMinXError, sourceName);
size_min_x = 4;
}
if (size_min_y <= 0) {
XLogger.err(Translation.Config_Check_GroupSizeMinYError, sourceName);
size_min_y = 4;
}
if (size_min_z <= 0) {
XLogger.err(Translation.Config_Check_GroupSizeMinZError, sourceName);
size_min_z = 4;
}
if (size_max_x < size_min_x && size_max_x != -1) {
XLogger.err(Translation.Config_Check_GroupMaxMinXError, sourceName);
size_max_x = 128;
size_min_x = 4;
}
if (size_max_y < size_min_y && size_max_y != -1) {
XLogger.err(Translation.Config_Check_GroupMaxMinYError, sourceName);
size_max_y = 64;
size_min_y = 4;
}
if (size_max_z < size_min_z && size_max_z != -1) {
XLogger.err(Translation.Config_Check_GroupMaxMinZError, sourceName);
size_max_z = 128;
size_min_z = 4;
}
if (amount < 0 && amount != -1) {
XLogger.err(Translation.Config_Check_GroupAmountError, sourceName);
amount = 10;
}
if (depth < 0 && depth != -1) {
XLogger.err(Translation.Config_Check_GroupDepthError, sourceName);
depth = 3;
}
}
}

View File

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

View File

@ -1,176 +0,0 @@
package cn.lunadeer.dominion.tuis;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import cn.lunadeer.minecraftpluginutils.stui.components.NumChanger;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
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) {
Player player = playerOnly(sender);
if (player == null) return;
if (notOp(player)) return;
int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion sys_config");
view.title("系统配置");
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("系统配置"));
Line limitSize = Line.create()
.append(Component.text("领地尺寸限制"));
view.add(limitSize);
Line spawnProtect = Line.create()
.append(Component.text(" 出生点保护范围"));
if (Dominion.config.getSpawnProtection() == -1) {
spawnProtect.append(Component.text("无限制")).append(Button.create("设置数值").setExecuteCommand("/dominion set_config spawn_protection 10 " + page).build());
} else {
spawnProtect.append(NumChanger.create(Dominion.config.getSpawnProtection(), "/dominion set_config spawn_protection").setPageNumber(page).build());
spawnProtect.append(Button.create("设置无限制").setExecuteCommand("/dominion set_config spawn_protection -1 " + page).build());
}
view.add(spawnProtect);
Line limitSizeX = Line.create()
.append(Component.text(" X轴(东西)"));
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(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(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(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(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(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(null))
.style(Style.style(TextDecoration.STRIKETHROUGH))
.hoverEvent(Component.text("因为垂直自动延伸已开启,此设置不可手动修改")));
}
view.add(limitSizeY);
if (Dominion.config.getLimitVert(null)) {
view.add(Line.create()
.append("垂直自动延伸")
.append(Button.createGreen("").setExecuteCommand("/dominion set_config limit_vert false " + page).build()));
} else {
view.add(Line.create()
.append("垂直自动延伸")
.append(Button.createRed("").setExecuteCommand("/dominion set_config limit_vert true " + page).build()));
}
Line limitMaxY = Line.create()
.append(Component.text("最高Y坐标限制"));
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(null), "/dominion set_config limit_min_y").setPageNumber(page).build());
view.add(limitMinY);
Line limitAmount = Line.create()
.append(Component.text("每个玩家领地数量限制"));
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(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(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(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);
if (Dominion.config.getLimitOpBypass()) {
view.add(Line.create()
.append("OP是否可以无视限制")
.append(Button.createGreen("").setExecuteCommand("/dominion set_config limit_op_bypass false " + page).build()));
} else {
view.add(Line.create()
.append("OP是否可以无视限制")
.append(Button.createRed("").setExecuteCommand("/dominion set_config limit_op_bypass true " + page).build()));
}
Line autoCreateRadius = Line.create()
.append(Component.text("自动创建半径"))
.append(NumChanger.create(Dominion.config.getAutoCreateRadius(), "/dominion set_config auto_create_radius").setPageNumber(page).build());
view.add(autoCreateRadius);
if (Dominion.config.getTpEnable()) {
view.add(Line.create()
.append("领地传送功能")
.append(Button.createGreen("").setExecuteCommand("/dominion set_config tp_enable false " + page).build()));
} else {
view.add(Line.create()
.append("领地传送功能")
.append(Button.createRed("").setExecuteCommand("/dominion set_config tp_enable true " + page).build()));
}
Line tpDelay = Line.create()
.append(Component.text(" 传送延迟(秒)"))
.append(NumChanger.create(Dominion.config.getTpDelay(), "/dominion set_config tp_delay").setPageNumber(page).build());
view.add(tpDelay);
Line tpCoolDown = Line.create()
.append(Component.text(" 传送冷却(秒)"))
.append(NumChanger.create(Dominion.config.getTpCoolDown(), "/dominion set_config tp_cool_down").setPageNumber(page).build());
view.add(tpCoolDown);
if (Dominion.config.getEconomyEnable()) {
Line economy = Line.create()
.append("经济系统");
view.add(economy);
Line price = Line.create()
.append(Component.text(" 每方块单价"))
.append(NumChanger.create(Dominion.config.getEconomyPrice(null), "/dominion set_config economy_price", 0.1).setPageNumber(page).build());
view.add(price);
if (Dominion.config.getEconomyOnlyXZ(null)) {
view.add(Line.create()
.append(" 仅计价平面积")
.append(Button.createGreen("").setExecuteCommand("/dominion set_config economy_only_xz false " + page).build()));
} else {
view.add(Line.create()
.append(" 仅计价平面积")
.append(Button.createRed("").setExecuteCommand("/dominion set_config economy_only_xz true " + page).build()));
}
Line refund = Line.create()
.append(Component.text(" 删除/缩小领地退还比例"))
.append(NumChanger.create(Dominion.config.getEconomyRefund(null), "/dominion set_config economy_refund", 0.01).setPageNumber(page).build());
view.add(refund);
}
if (Dominion.config.getResidenceMigration()) {
view.add(Line.create()
.append("是否允许从Residence迁移数据")
.append(Button.createGreen("").setExecuteCommand("/dominion set_config residence_migration false " + page).build()));
} else {
view.add(Line.create()
.append("是否允许从Residence迁移数据")
.append(Button.createRed("").setExecuteCommand("/dominion set_config residence_migration true " + page).build()));
}
view.showOn(player, page);
}
}

View File

@ -1,80 +0,0 @@
package cn.lunadeer.dominion.tuis.dominion;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.*;
public class DominionManage {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = getDominionNameArg_1(player, args);
if (dominion == null) {
Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion manage <领地名称>");
return;
}
if (noAuthToManage(player, dominion)) return;
int page = getPage(args, 2);
Line size_info = Line.create()
.append(Button.create("详细信息").setExecuteCommand("/dominion info " + dominion.getName()).build())
.append("查看领地详细信息");
Line env_info = Line.create()
.append(Button.create("环境设置").setExecuteCommand("/dominion env_setting " + dominion.getName()).build())
.append("设置领地内的一些非玩家相关效果");
Line flag_info = Line.create()
.append(Button.create("访客权限").setExecuteCommand("/dominion guest_setting " + dominion.getName()).build())
.append("访客在此领地的权限");
Line privilege_list = Line.create()
.append(Button.create("成员管理").setExecuteCommand("/dominion member list " + dominion.getName()).build())
.append("管理此领地成员的权限");
Line group_list = Line.create()
.append(Button.create("权限组").setExecuteCommand("/dominion group list " + dominion.getName()).build())
.append("管理此领地的权限组");
Line set_tp = Line.create()
.append(Button.create("设置传送点").setExecuteCommand("/dominion set_tp_location " + dominion.getName()).build())
.append("设置当前位置为此领地传送点");
Line rename = Line.create()
.append(Button.create("重命名").setExecuteCommand("/dominion cui_rename " + dominion.getName()).build())
.append("重命名领地");
Line join_msg = Line.create()
.append(Button.create("编辑欢迎提示语").setExecuteCommand("/dominion cui_edit_join_message " + dominion.getName()).build())
.append("当玩家进入领地时显示的消息");
Line leave_msg = Line.create()
.append(Button.create("编辑离开提示语").setExecuteCommand("/dominion cui_edit_leave_message " + dominion.getName()).build())
.append("当玩家离开领地时显示的消息");
Line map_color = Line.create()
.append(Button.create("设置颜色").setExecuteCommand("/dominion cui_set_map_color " + dominion.getName()).build())
.append(Component.text("设置卫星地图上的地块颜色")
.append(Component.text(dominion.getColor(),
TextColor.color(dominion.getColorR(), dominion.getColorG(), dominion.getColorB()))));
ListView view = ListView.create(10, "/dominion manage " + dominion.getName());
view.title("领地 " + dominion.getName() + " 管理界面")
.navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
.append(dominion.getName()))
.add(size_info)
.add(env_info)
.add(flag_info)
.add(privilege_list)
.add(group_list)
.add(set_tp)
.add(rename)
.add(join_msg)
.add(leave_msg);
if (Dominion.config.getBlueMap()) {
view.add(map_color);
}
view.showOn(player, page);
}
}

View File

@ -1,53 +0,0 @@
package cn.lunadeer.dominion.tuis.dominion.manage;
import cn.lunadeer.dominion.controllers.PlayerController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.utils.Particle;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.View;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import 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) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = getDominionNameArg_1(player, args);
if (dominion == null) {
Notification.error(sender, "你不在任何领地内,请指定领地名称 /dominion info <领地名称>");
return;
}
PlayerDTO owner = PlayerController.getPlayerDTO(dominion.getOwner());
Integer x1 = dominion.getX1();
Integer y1 = dominion.getY1();
Integer z1 = dominion.getZ1();
Integer x2 = dominion.getX2();
Integer y2 = dominion.getY2();
Integer z2 = dominion.getZ2();
View view = View.create();
view.title("领地 " + dominion.getName() + " 的尺寸信息")
.subtitle("领地所有者:" + owner.getLastKnownName())
.addLine(Line.create().append("领地大小:").append(dominion.getWidthX() + " x " + dominion.getHeight() + " x " + dominion.getWidthZ()))
.addLine(Line.create().append("中心坐标:").append((x1 + (x2 - x1) / 2) + " " + (y1 + (y2 - y1) / 2) + " " + (z1 + (z2 - z1) / 2)))
.addLine(Line.create().append("垂直高度:").append(String.valueOf(dominion.getHeight())))
.addLine(Line.create().append("Y轴坐标").append(y1 + " ~ " + y2))
.addLine(Line.create().append("水平面积:").append(String.valueOf(dominion.getSquare())))
.addLine(Line.create().append("领地体积:").append(String.valueOf(dominion.getVolume())))
.addLine(Line.create().append("传送点坐标:").append(
dominion.getTpLocation() == null ?
"" :
dominion.getTpLocation().getX() + " " + dominion.getTpLocation().getY() + " " + dominion.getTpLocation().getZ()
))
.actionBar(Line.create()
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append(Button.create("访客权限").setExecuteCommand("/dominion guest_setting " + dominion.getName()).build()))
.showOn(player);
Particle.showBorder(player, dominion);
}
}

View File

@ -1,10 +1,10 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.AbstractOperator; import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.DominionManage; import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.Location; import org.bukkit.Location;
@ -34,7 +34,7 @@ public class CreateDominion {
Map<Integer, Location> points = autoPoints(sender); Map<Integer, Location> points = autoPoints(sender);
operator.getResponse().thenAccept(result -> { operator.getResponse().thenAccept(result -> {
if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)) { if (Objects.equals(result.getStatus(), AbstractOperator.Result.SUCCESS)) {
DominionManage.show(sender, new String[]{"list"}); DominionManage.show(sender, new String[]{"manage", input});
} }
}); });
DominionController.create(operator, input, points.get(0), points.get(1)); DominionController.create(operator, input, points.get(0), points.get(1));

View File

@ -1,10 +1,10 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.GroupController; import cn.lunadeer.dominion.controllers.GroupController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupList; import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupList;
import cn.lunadeer.minecraftpluginutils.ColorParser; import cn.lunadeer.minecraftpluginutils.ColorParser;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;

View File

@ -1,9 +1,9 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController; import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.template.TemplateList; import cn.lunadeer.dominion.uis.tuis.template.TemplateList;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -1,10 +1,10 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.DominionManage; import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;

View File

@ -1,10 +1,10 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.DominionManage; import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;

View File

@ -1,12 +1,12 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.AbstractOperator; import cn.lunadeer.dominion.controllers.AbstractOperator;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.MemberController; import cn.lunadeer.dominion.controllers.MemberController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberList; import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.MemberList;
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectPlayer; import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.SelectPlayer;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;

View File

@ -1,9 +1,9 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.DominionManage; import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -1,10 +1,10 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.GroupController; import cn.lunadeer.dominion.controllers.GroupController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupSetting; import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupSetting;
import cn.lunadeer.minecraftpluginutils.ColorParser; import cn.lunadeer.minecraftpluginutils.ColorParser;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;

View File

@ -1,10 +1,10 @@
package cn.lunadeer.dominion.cuis; package cn.lunadeer.dominion.uis.cuis;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.DominionManage; import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput; import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.uis.tuis;
import cn.lunadeer.dominion.DominionNode; import cn.lunadeer.dominion.DominionNode;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line; import cn.lunadeer.minecraftpluginutils.stui.components.Line;
@ -10,7 +11,7 @@ import org.bukkit.entity.Player;
import java.util.List; import java.util.List;
import static cn.lunadeer.dominion.tuis.dominion.DominionList.BuildTreeLines; import static cn.lunadeer.dominion.uis.tuis.dominion.DominionList.BuildTreeLines;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly; import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.getPage; import static cn.lunadeer.dominion.utils.TuiUtils.getPage;
import static cn.lunadeer.dominion.utils.TuiUtils.notOp; import static cn.lunadeer.dominion.utils.TuiUtils.notOp;
@ -27,8 +28,8 @@ public class AllDominion {
ListView view = ListView.create(10, "/dominion all_dominion"); ListView view = ListView.create(10, "/dominion all_dominion");
view.title("所有领地"); view.title(Translation.TUI_Navigation_AllDominion);
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("所有领地")); view.navigator(Line.create().append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build()).append((Translation.TUI_Navigation_AllDominion)));
view.addLines(BuildTreeLines(allDominions, 0)); view.addLines(BuildTreeLines(allDominions, 0));
view.showOn(player, page); view.showOn(player, page);
} }

View File

@ -0,0 +1,83 @@
package cn.lunadeer.dominion.uis.tuis;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.ViewStyles;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
public class Menu {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
int page = 1;
if (args.length == 2) {
try {
page = Integer.parseInt(args[1]);
} catch (Exception ignored) {
}
}
Line create = Line.create()
.append(Button.create(Translation.TUI_Menu_CreateDominionButton).setExecuteCommand("/dominion cui_create").build())
.append(Translation.TUI_Menu_CreateDominionDescription);
Line list = Line.create()
.append(Button.create(Translation.TUI_Menu_MyDominionButton).setExecuteCommand("/dominion list").build())
.append(Translation.TUI_Menu_MyDominionDescription);
Line title = Line.create()
.append(Button.create(Translation.TUI_Menu_TitleListButton).setExecuteCommand("/dominion title_list").build())
.append(Translation.TUI_Menu_TitleListDescription);
Line template = Line.create()
.append(Button.create(Translation.TUI_Menu_TemplateListButton).setExecuteCommand("/dominion template list").build())
.append(Translation.TUI_Menu_TemplateListDescription);
Line help = Line.create()
.append(Button.create(Translation.TUI_Menu_CommandHelpButton).setOpenURL(
String.format("https://dominion.lunadeer.cn/%s/command-list.html", Dominion.config.getLanguage())
).build())
.append(Translation.TUI_Menu_CommandHelpDescription);
Line link = Line.create()
.append(Button.create(Translation.TUI_Menu_DocumentButton).setOpenURL(
String.format("https://dominion.lunadeer.cn/%s", Dominion.config.getLanguage())
).build())
.append(Translation.TUI_Menu_DocumentDescription);
Line migrate = Line.create()
.append(Button.create(Translation.TUI_Menu_MigrateButton).setExecuteCommand("/dominion migrate_list").build())
.append(Translation.TUI_Menu_MigrateDescription);
Line all = Line.create()
.append(Button.create(Translation.TUI_Menu_AllDominionButton).setExecuteCommand("/dominion all_dominion").build())
.append(Translation.TUI_Menu_AllDominionDescription);
Line reload_cache = Line.create()
.append(Button.create(Translation.TUI_Menu_ReloadCacheButton).setExecuteCommand("/dominion reload_cache").build())
.append(Translation.TUI_Menu_ReloadCacheDescription);
Line reload_config = Line.create()
.append(Button.create(Translation.TUI_Menu_ReloadConfigButton).setExecuteCommand("/dominion reload_config").build())
.append(Translation.TUI_Menu_ReloadConfigDescription);
ListView view = ListView.create(10, "/dominion menu");
view.title(Translation.TUI_Menu_Title);
view.navigator(Line.create().append(Translation.TUI_Navigation_Menu));
view.add(create);
view.add(list);
if (Dominion.config.getGroupTitleEnable()) view.add(title);
view.add(template);
view.add(help);
view.add(link);
if (Dominion.config.getResidenceMigration()) {
view.add(migrate);
}
if (player.isOp()) {
view.add(Line.create().append(""));
view.add(Line.create().append(Component.text(Translation.TUI_Menu_OpOnlySection.trans(), ViewStyles.main_color)));
view.add(all);
view.add(reload_cache);
view.add(reload_config);
}
view.showOn(player, page);
}
}

View File

@ -1,18 +1,14 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.uis.tuis;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.ResMigration; import cn.lunadeer.dominion.utils.ResMigration;
import cn.lunadeer.dominion.utils.TuiUtils; import cn.lunadeer.dominion.utils.TuiUtils;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line; import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -28,7 +24,7 @@ public class MigrateList {
if (player == null) return; if (player == null) return;
if (!Dominion.config.getResidenceMigration()) { if (!Dominion.config.getResidenceMigration()) {
Notification.error(sender, "Residence 迁移功能没有开启"); Notification.error(sender, Translation.Commands_Residence_MigrationDisabled);
return; return;
} }
@ -36,13 +32,13 @@ public class MigrateList {
ListView view = ListView.create(10, "/dominion migrate_list"); ListView view = ListView.create(10, "/dominion migrate_list");
view.title("从 Residence 迁移数据"); view.title(Translation.TUI_Migrate_Title);
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("Res数据")); view.navigator(Line.create().append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build()).append(Translation.TUI_Navigation_MigrateList));
List<ResMigration.ResidenceNode> res_data = Cache.instance.getResidenceData(player.getUniqueId()); List<ResMigration.ResidenceNode> res_data = Cache.instance.getResidenceData(player.getUniqueId());
if (res_data == null) { if (res_data == null) {
view.add(Line.create().append("你没有可迁移的数据")); view.add(Line.create().append(Translation.TUI_Migrate_NoData));
} else { } else {
view.addLines(BuildTreeLines(res_data, 0, page)); view.addLines(BuildTreeLines(res_data, 0, page));
} }
@ -53,19 +49,14 @@ public class MigrateList {
public static List<Line> BuildTreeLines(List<ResMigration.ResidenceNode> dominionTree, Integer depth, int page) { public static List<Line> BuildTreeLines(List<ResMigration.ResidenceNode> dominionTree, Integer depth, int page) {
List<Line> lines = new ArrayList<>(); List<Line> lines = new ArrayList<>();
StringBuilder prefix = new StringBuilder(); StringBuilder prefix = new StringBuilder();
for (int i = 0; i < depth; i++) { prefix.append(" | ".repeat(Math.max(0, depth)));
prefix.append(" | ");
}
for (ResMigration.ResidenceNode node : dominionTree) { for (ResMigration.ResidenceNode node : dominionTree) {
TextComponent migrate = Button.create("迁移").setExecuteCommand("/dominion migrate " + node.name + " " + page).build(); Button migrate = Button.create(Translation.TUI_Migrate_Button).setExecuteCommand("/dominion migrate " + node.name + " " + page);
Line line = Line.create(); Line line = Line.create();
if (depth == 0) { if (depth == 0) {
line.append(migrate); line.append(migrate.build());
} else { } else {
line.append(Component.text("[迁移]", line.append(migrate.setDisabled(Translation.TUI_Migrate_SubDominion).build());
Style.style(TextColor.color(190, 190, 190),
TextDecoration.STRIKETHROUGH))
.hoverEvent(Component.text("子领地无法手动迁移,会随父领地自动迁移")));
} }
line.append(prefix + node.name); line.append(prefix + node.name);
lines.add(line); lines.add(line);

View File

@ -1,8 +1,9 @@
package cn.lunadeer.dominion.tuis; package cn.lunadeer.dominion.uis.tuis;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.GroupDTO; import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line; import cn.lunadeer.minecraftpluginutils.stui.components.Line;
@ -26,8 +27,8 @@ public class TitleList {
int page = getPage(args, 1); int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion title_list"); ListView view = ListView.create(10, "/dominion title_list");
view.title("我可使用的权限组称号"); view.title(Translation.TUI_TitleList_Title);
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("权限组称号列表")); view.navigator(Line.create().append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build()).append(Translation.TUI_Navigation_TitleList));
List<GroupDTO> groups = Cache.instance.getBelongGroupsOf(player.getUniqueId()); List<GroupDTO> groups = Cache.instance.getBelongGroupsOf(player.getUniqueId());
GroupDTO using = Cache.instance.getPlayerUsingGroupTitle(player.getUniqueId()); GroupDTO using = Cache.instance.getPlayerUsingGroupTitle(player.getUniqueId());
@ -43,11 +44,11 @@ public class TitleList {
DominionDTO dominion = Cache.instance.getDominion(group.getDomID()); DominionDTO dominion = Cache.instance.getDominion(group.getDomID());
Line line = Line.create(); Line line = Line.create();
if (using != null && using.getId().equals(group.getId())) { if (using != null && using.getId().equals(group.getId())) {
line.append(Button.createRed("卸下").setExecuteCommand("/dominion use_title -1").build()); line.append(Button.createRed(Translation.TUI_TitleList_RemoveButton).setExecuteCommand("/dominion use_title -1").build());
} else { } else {
line.append(Button.createGreen("使用").setExecuteCommand("/dominion use_title " + group.getId()).build()); line.append(Button.createGreen(Translation.TUI_TitleList_ApplyButton).setExecuteCommand("/dominion use_title " + group.getId()).build());
} }
line.append(group.getNameColoredComponent()).append("来自领地:" + dominion.getName()); line.append(group.getNameColoredComponent()).append(Translation.TUI_TitleList_FromDominion.trans() + dominion.getName());
view.add(line); view.add(line);
} }

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.tuis.dominion; package cn.lunadeer.dominion.uis.tuis.dominion;
import cn.lunadeer.dominion.DominionNode; import cn.lunadeer.dominion.DominionNode;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.ViewStyles; import cn.lunadeer.minecraftpluginutils.stui.ViewStyles;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -25,16 +26,18 @@ public class DominionList {
int page = getPage(args, 1); int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion list"); ListView view = ListView.create(10, "/dominion list");
view.title("我的领地列表"); view.title(Translation.TUI_DominionList_Title);
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("我的领地")); view.navigator(Line.create()
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Translation.TUI_Navigation_DominionList));
view.addLines(BuildTreeLines(DominionNode.BuildNodeTree(-1, DominionDTO.selectByOwner(player.getUniqueId())), 0)); view.addLines(BuildTreeLines(DominionNode.BuildNodeTree(-1, DominionDTO.selectByOwner(player.getUniqueId())), 0));
List<String> admin_dominions = playerAdminDominions(sender); List<String> admin_dominions = playerAdminDominions(sender);
if (!admin_dominions.isEmpty()) { if (!admin_dominions.isEmpty()) {
view.add(Line.create().append("")); view.add(Line.create().append(""));
view.add(Line.create().append(Component.text("--- 以下为你拥有管理员权限的领地 ---", ViewStyles.main_color))); view.add(Line.create().append(Component.text(Translation.TUI_DominionList_AdminSection.trans(), ViewStyles.main_color)));
} }
for (String dominion : admin_dominions) { for (String dominion : admin_dominions) {
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + dominion).build(); TextComponent manage = Button.createGreen(Translation.TUI_ManageButton).setExecuteCommand("/dominion manage " + dominion).build();
view.add(Line.create().append(manage).append(dominion)); view.add(Line.create().append(manage).append(dominion));
} }
view.showOn(player, page); view.showOn(player, page);
@ -45,8 +48,8 @@ public class DominionList {
StringBuilder prefix = new StringBuilder(); StringBuilder prefix = new StringBuilder();
prefix.append(" | ".repeat(Math.max(0, depth))); prefix.append(" | ".repeat(Math.max(0, depth)));
for (DominionNode node : dominionTree) { for (DominionNode node : dominionTree) {
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.getDominion().getName()).build(); TextComponent manage = Button.createGreen(Translation.TUI_ManageButton).setExecuteCommand("/dominion manage " + node.getDominion().getName()).build();
TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.getDominion().getName()).build(); TextComponent delete = Button.createRed(Translation.TUI_DeleteButton).setExecuteCommand("/dominion delete " + node.getDominion().getName()).build();
Line line = Line.create().append(delete).append(manage).append(prefix + node.getDominion().getName()); Line line = Line.create().append(delete).append(manage).append(prefix + node.getDominion().getName());
lines.add(line); lines.add(line);
lines.addAll(BuildTreeLines(node.getChildren(), depth + 1)); lines.addAll(BuildTreeLines(node.getChildren(), depth + 1));

View File

@ -0,0 +1,81 @@
package cn.lunadeer.dominion.uis.tuis.dominion;
import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static cn.lunadeer.dominion.utils.CommandUtils.playerOnly;
import static cn.lunadeer.dominion.utils.TuiUtils.*;
public class DominionManage {
public static void show(CommandSender sender, String[] args) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = getDominionNameArg_1(player, args);
if (dominion == null) {
Notification.error(sender, Translation.TUI_DominionManage_NotInDominion);
return;
}
if (noAuthToManage(player, dominion)) return;
int page = getPage(args, 2);
Line size_info = Line.create()
.append(Button.create(Translation.TUI_DominionManage_InfoButton).setExecuteCommand("/dominion info " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_InfoDescription);
Line env_info = Line.create()
.append(Button.create(Translation.TUI_DominionManage_EnvSettingButton).setExecuteCommand("/dominion env_setting " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_EnvSettingDescription);
Line flag_info = Line.create()
.append(Button.create(Translation.TUI_DominionManage_GuestSettingButton).setExecuteCommand("/dominion guest_setting " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_GuestSettingDescription);
Line privilege_list = Line.create()
.append(Button.create(Translation.TUI_DominionManage_MemberListButton).setExecuteCommand("/dominion member list " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_MemberListDescription);
Line group_list = Line.create()
.append(Button.create(Translation.TUI_DominionManage_GroupListButton).setExecuteCommand("/dominion group list " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_GroupListDescription);
Line set_tp = Line.create()
.append(Button.create(Translation.TUI_DominionManage_SetTpLocationButton).setExecuteCommand("/dominion set_tp_location " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_SetTpLocationDescription);
Line rename = Line.create()
.append(Button.create(Translation.TUI_DominionManage_RenameButton).setExecuteCommand("/dominion cui_rename " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_RenameDescription);
Line join_msg = Line.create()
.append(Button.create(Translation.TUI_DominionManage_EditJoinMessageButton).setExecuteCommand("/dominion cui_edit_join_message " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_EditJoinMessageDescription);
Line leave_msg = Line.create()
.append(Button.create(Translation.TUI_DominionManage_EditLeaveMessageButton).setExecuteCommand("/dominion cui_edit_leave_message " + dominion.getName()).build())
.append(Translation.TUI_DominionManage_EditLeaveMessageDescription);
Line map_color = Line.create()
.append(Button.create(Translation.TUI_DominionManage_SetMapColorButton).setExecuteCommand("/dominion cui_set_map_color " + dominion.getName()).build())
.append(Component.text(Translation.TUI_DominionManage_SetMapColorDescription.trans())
.append(Component.text(dominion.getColor(),
TextColor.color(dominion.getColorR(), dominion.getColorG(), dominion.getColorB()))));
ListView view = ListView.create(10, "/dominion manage " + dominion.getName());
view.title(String.format(Translation.TUI_DominionManage_Title.trans(), dominion.getName()))
.navigator(Line.create()
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
.append(dominion.getName()))
.add(size_info)
.add(env_info)
.add(flag_info)
.add(privilege_list)
.add(group_list)
.add(set_tp)
.add(rename)
.add(join_msg)
.add(leave_msg);
if (Dominion.config.getBlueMap() || Dominion.config.getDynmap()) {
view.add(map_color);
}
view.showOn(player, page);
}
}

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.tuis.dominion.manage; package cn.lunadeer.dominion.uis.tuis.dominion.manage;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -17,25 +18,25 @@ public class EnvSetting {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion env_setting <领地名称> [页码]"); Notification.error(sender, Translation.TUI_EnvSetting_Usage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]); DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[1]); Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
return; return;
} }
int page = getPage(args, 2); int page = getPage(args, 2);
ListView view = ListView.create(10, "/dominion env_setting " + dominion.getName()); ListView view = ListView.create(10, "/dominion env_setting " + dominion.getName());
view.title("领地 " + dominion.getName() + " 环境设置") view.title(String.format(Translation.TUI_EnvSetting_Title.trans(), dominion.getName()))
.navigator(Line.create() .navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) .append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("环境设置")); .append(Translation.TUI_Navigation_EnvSetting));
for (Flag flag : Flag.getDominionOnlyFlagsEnabled()) { for (Flag flag : Flag.getEnvironmentFlagsEnabled()) {
view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page)); view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page));
} }
view.showOn(player, page); view.showOn(player, page);

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.tuis.dominion.manage; package cn.lunadeer.dominion.uis.tuis.dominion.manage;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -17,24 +18,24 @@ public class GuestSetting {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion guest_setting <领地名称> [页码]"); Notification.error(sender, Translation.TUI_GuestSetting_Usage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[1]); DominionDTO dominion = DominionDTO.select(args[1]);
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[1]); Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
return; return;
} }
int page = getPage(args, 2); int page = getPage(args, 2);
ListView view = ListView.create(10, "/dominion guest_setting " + dominion.getName()); ListView view = ListView.create(10, "/dominion guest_setting " + dominion.getName());
view.title("领地 " + dominion.getName() + " 访客权限") view.title(String.format(Translation.TUI_GuestSetting_Title.trans(), dominion.getName()))
.navigator(Line.create() .navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) .append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("访客权限")); .append(Translation.TUI_Navigation_GuestSetting));
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page)); view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page));
} }

View File

@ -0,0 +1,54 @@
package cn.lunadeer.dominion.uis.tuis.dominion.manage;
import cn.lunadeer.dominion.controllers.PlayerController;
import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.Particle;
import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.View;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import 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) {
Player player = playerOnly(sender);
if (player == null) return;
DominionDTO dominion = getDominionNameArg_1(player, args);
if (dominion == null) {
Notification.error(sender, Translation.TUI_SizeInfo_Usage);
return;
}
PlayerDTO owner = PlayerController.getPlayerDTO(dominion.getOwner());
Integer x1 = dominion.getX1();
Integer y1 = dominion.getY1();
Integer z1 = dominion.getZ1();
Integer x2 = dominion.getX2();
Integer y2 = dominion.getY2();
Integer z2 = dominion.getZ2();
View view = View.create();
view.title(String.format(Translation.TUI_SizeInfo_Title.trans(), dominion.getName()))
.subtitle(Translation.TUI_SizeInfo_Owner.trans() + owner.getLastKnownName())
.addLine(Line.create().append(Translation.TUI_SizeInfo_Size).append(dominion.getWidthX() + " x " + dominion.getHeight() + " x " + dominion.getWidthZ()))
.addLine(Line.create().append(Translation.TUI_SizeInfo_Center).append((x1 + (x2 - x1) / 2) + " " + (y1 + (y2 - y1) / 2) + " " + (z1 + (z2 - z1) / 2)))
.addLine(Line.create().append(Translation.TUI_SizeInfo_Vertical).append(String.valueOf(dominion.getHeight())))
.addLine(Line.create().append(Translation.TUI_SizeInfo_VertY).append(y1 + " ~ " + y2))
.addLine(Line.create().append(Translation.TUI_SizeInfo_Square).append(String.valueOf(dominion.getSquare())))
.addLine(Line.create().append(Translation.TUI_SizeInfo_Volume).append(String.valueOf(dominion.getVolume())))
.addLine(Line.create().append(Translation.TUI_SizeInfo_TpLocation).append(
dominion.getTpLocation() == null ?
Translation.TUI_SizeInfo_NoneTp.trans() :
dominion.getTpLocation().getX() + " " + dominion.getTpLocation().getY() + " " + dominion.getTpLocation().getZ()
))
.actionBar(Line.create()
.append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append(Button.create(Translation.TUI_Navigation_GuestSetting).setExecuteCommand("/dominion guest_setting " + dominion.getName()).build()))
.showOn(player);
Particle.showBorder(player, dominion);
}
}

View File

@ -1,9 +1,10 @@
package cn.lunadeer.dominion.tuis.dominion.manage.group; package cn.lunadeer.dominion.uis.tuis.dominion.manage.group;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.GroupDTO; import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.TuiUtils; import cn.lunadeer.dominion.utils.TuiUtils;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
@ -31,45 +32,45 @@ public class GroupList {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
if (args.length < 3) { if (args.length < 3) {
Notification.error(sender, "用法: /dominion group list <领地名称> [页码]"); Notification.error(sender, Translation.TUI_GroupList_Usage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]); DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]); Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
return; return;
} }
if (noAuthToManage(player, dominion)) return; if (noAuthToManage(player, dominion)) return;
int page = TuiUtils.getPage(args, 3); int page = TuiUtils.getPage(args, 3);
List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId()); List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId());
ListView view = ListView.create(10, "/dominion group list " + dominion.getName()); ListView view = ListView.create(10, "/dominion group list " + dominion.getName());
view.title("权限组列表"); view.title(String.format(Translation.TUI_GroupList_Title.trans(), dominion.getName()));
view.navigator( view.navigator(
Line.create() Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) .append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("权限组列表") .append(Translation.TUI_Navigation_GroupList)
); );
Button create_btn = Button.createGreen("创建权限组") Button create_btn = Button.createGreen(Translation.TUI_GroupList_CreateButton)
.setHoverText("创建一个新的权限组") .setHoverText(Translation.TUI_GroupList_CreateDescription)
.setExecuteCommand("/dominion cui_create_group " + dominion.getName()); .setExecuteCommand("/dominion cui_create_group " + dominion.getName());
view.add(new Line().append(create_btn.build())); view.add(new Line().append(create_btn.build()));
for (GroupDTO group : groups) { for (GroupDTO group : groups) {
Line line = new Line(); Line line = new Line();
Button del = Button.createRed("删除") Button del = Button.createRed(Translation.TUI_DeleteButton)
.setHoverText("删除权限组 " + group.getName()) .setHoverText(String.format(Translation.TUI_GroupList_DeleteDescription.trans(), group.getNamePlain()))
.setExecuteCommand("/dominion group delete " + dominion.getName() + " " + group.getName()); .setExecuteCommand("/dominion group delete " + dominion.getName() + " " + group.getNamePlain());
Button edit = Button.create("编辑") Button edit = Button.create(Translation.TUI_EditButton)
.setHoverText("编辑权限组 " + group.getName()) .setHoverText(String.format(Translation.TUI_GroupList_EditDescription.trans(), group.getNamePlain()))
.setExecuteCommand("/dominion group setting " + dominion.getName() + " " + group.getName()); .setExecuteCommand("/dominion group setting " + dominion.getName() + " " + group.getNamePlain());
Button add = Button.createGreen("+") Button add = Button.createGreen("+")
.setHoverText("添加成员到权限组 " + group.getName()) .setHoverText(String.format(Translation.TUI_GroupList_AddMemberDescription.trans(), group.getNamePlain()))
.setExecuteCommand("/dominion group select_member " + dominion.getName() + " " + group.getName() + " " + page); .setExecuteCommand("/dominion group select_member " + dominion.getName() + " " + group.getNamePlain() + " " + page);
line.append(del.build()).append(edit.build()).append(group.getNameColoredComponent()).append(add.build()); line.append(del.build()).append(edit.build()).append(group.getNameColoredComponent()).append(add.build());
view.add(line); view.add(line);
List<MemberDTO> players = MemberDTO.selectByGroupId(group.getId()); List<MemberDTO> players = MemberDTO.selectByGroupId(group.getId());
@ -78,8 +79,10 @@ public class GroupList {
PlayerDTO p = PlayerDTO.select(playerPrivilege.getPlayerUUID()); PlayerDTO p = PlayerDTO.select(playerPrivilege.getPlayerUUID());
if (p == null) continue; if (p == null) continue;
Button remove = Button.createRed("-") Button remove = Button.createRed("-")
.setHoverText("" + p.getLastKnownName() + " 移出权限组 " + group.getName()) .setHoverText(
.setExecuteCommand("/dominion group remove_member " + dominion.getName() + " " + group.getName() + " " + p.getLastKnownName() + " " + page); String.format(Translation.TUI_GroupList_RemoveMemberDescription.trans(), p.getLastKnownName(), group.getNamePlain())
)
.setExecuteCommand("/dominion group remove_member " + dominion.getName() + " " + group.getNamePlain() + " " + p.getLastKnownName() + " " + page);
Line playerLine = new Line().setDivider(""); Line playerLine = new Line().setDivider("");
playerLine.append(Component.text(" ")); playerLine.append(Component.text(" "));
playerLine.append(remove.build()).append(" | " + p.getLastKnownName()); playerLine.append(remove.build()).append(" | " + p.getLastKnownName());

View File

@ -1,8 +1,9 @@
package cn.lunadeer.dominion.tuis.dominion.manage.group; package cn.lunadeer.dominion.uis.tuis.dominion.manage.group;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.GroupDTO; import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.TuiUtils; import cn.lunadeer.dominion.utils.TuiUtils;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
@ -26,54 +27,62 @@ public class GroupSetting {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
if (args.length < 4) { if (args.length < 4) {
Notification.error(sender, "用法: /dominion group setting <领地名称> <权限组名称> [页码]"); Notification.error(sender, Translation.TUI_GroupSetting_Usage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]); DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]); Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
return; return;
} }
if (noAuthToManage(player, dominion)) return; if (noAuthToManage(player, dominion)) return;
int page = TuiUtils.getPage(args, 4); int page = TuiUtils.getPage(args, 4);
GroupDTO group = GroupDTO.select(dominion.getId(), args[3]); GroupDTO group = GroupDTO.select(dominion.getId(), args[3]);
if (group == null) { if (group == null) {
Notification.error(sender, "权限组 %s 不存在", args[3]); Notification.error(sender, Translation.Messages_GroupNotExist, args[2], args[3]);
return; return;
} }
ListView view = ListView.create(10, "/dominion group setting " + dominion.getName() + " " + group.getName()); ListView view = ListView.create(10, "/dominion group setting " + dominion.getName() + " " + group.getNamePlain());
view.title(Component.text("权限组 ").append(group.getNameColoredComponent()).append(Component.text(" 管理"))); view.title(Component.text(Translation.TUI_GroupSetting_TitleL.trans())
.append(group.getNameColoredComponent())
.append(Component.text(Translation.TUI_GroupSetting_TitleR.trans())));
view.navigator( view.navigator(
Line.create() Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) .append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append(Button.create("权限组列表").setExecuteCommand("/dominion group list " + dominion.getName()).build()) .append(Button.create(Translation.TUI_Navigation_GroupList).setExecuteCommand("/dominion group list " + dominion.getName()).build())
.append("权限组管理") .append(Translation.TUI_Navigation_GroupSetting)
); );
Button rename_btn = Button.create("重命名此权限组") Button rename_btn = Button.create(Translation.TUI_GroupSetting_RenameButton)
.setHoverText("重命名权限组 " + group.getName()) .setHoverText(String.format(Translation.TUI_GroupSetting_RenameDescription.trans(), group.getNamePlain()))
.setExecuteCommand("/dominion cui_rename_group " + dominion.getName() + " " + group.getName()); .setExecuteCommand("/dominion cui_rename_group " + dominion.getName() + " " + group.getNamePlain());
view.add(Line.create().append(rename_btn.build())); view.add(Line.create().append(rename_btn.build()));
if (group.getAdmin()) { if (group.getAdmin()) {
view.add(Line.create() view.add(Line.create()
.append(Button.createGreen("") .append(Button.createGreen("")
.setExecuteCommand(parseCommand(dominion.getName(), group.getName(), "admin", false, page)) .setExecuteCommand(parseCommand(dominion.getName(), group.getNamePlain(), "admin", false, page))
.build()) .build())
.append("管理员")); .append(
view.add(createOption(Flag.GLOW, group.getFlagValue(Flag.GLOW), dominion.getName(), group.getName(), page)); Component.text(Translation.Flags_admin_DisplayName.trans())
.hoverEvent(Component.text(Translation.Flags_admin_Description.trans()))
));
view.add(createOption(Flag.GLOW, group.getFlagValue(Flag.GLOW), dominion.getName(), group.getNamePlain(), page));
} else { } else {
view.add(Line.create() view.add(Line.create()
.append(Button.createRed("") .append(Button.createRed("")
.setExecuteCommand(parseCommand(dominion.getName(), group.getName(), "admin", true, page)) .setExecuteCommand(parseCommand(dominion.getName(), group.getNamePlain(), "admin", true, page))
.build()) .build())
.append("管理员")); .append(
Component.text(Translation.Flags_admin_DisplayName.trans())
.hoverEvent(Component.text(Translation.Flags_admin_Description.trans()))
));
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, group.getFlagValue(flag), dominion.getName(), group.getName(), page)); view.add(createOption(flag, group.getFlagValue(flag), dominion.getName(), group.getNamePlain(), page));
} }
} }
view.showOn(player, page); view.showOn(player, page);

View File

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

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.tuis.dominion.manage.member; package cn.lunadeer.dominion.uis.tuis.dominion.manage.member;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.*; import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -32,29 +33,29 @@ public class MemberList {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
if (args.length < 3) { if (args.length < 3) {
Notification.error(sender, "用法: /dominion member list <领地名称> [页码]"); Notification.error(sender, Translation.TUI_MemberList_Usage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]); DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]); Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
return; return;
} }
int page = getPage(args, 3); int page = getPage(args, 3);
ListView view = ListView.create(10, "/dominion member list " + dominion.getName()); ListView view = ListView.create(10, "/dominion member list " + dominion.getName());
if (noAuthToManage(player, dominion)) return; if (noAuthToManage(player, dominion)) return;
List<MemberDTO> privileges = MemberDTO.select(dominion.getId()); List<MemberDTO> privileges = MemberDTO.select(dominion.getId());
view.title("领地 " + dominion.getName() + " 成员列表"); view.title(String.format(Translation.TUI_MemberList_Title.trans(), dominion.getName()));
view.navigator( view.navigator(
Line.create() Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) .append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append("成员列表") .append(Translation.TUI_Navigation_MemberList)
); );
view.add(Line.create().append(Button.create("添加成员") view.add(Line.create().append(Button.create(Translation.TUI_MemberList_AddButton)
.setExecuteCommand(CommandParser("/dominion member select_player %s", dominion.getName())).build())); .setExecuteCommand(CommandParser("/dominion member select_player %s", dominion.getName())).build()));
for (MemberDTO privilege : privileges) { for (MemberDTO privilege : privileges) {
PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID()); PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID());
@ -74,11 +75,11 @@ public class MemberList {
} }
} }
Button prev = Button.createGreen("权限") Button prev = Button.createGreen(Translation.TUI_MemberList_FlagButton)
.setHoverText("配置成员权限") .setHoverText(Translation.TUI_MemberList_FlagDescription)
.setExecuteCommand(CommandParser("/dominion member setting %s %s", dominion.getName(), p_player.getLastKnownName())); .setExecuteCommand(CommandParser("/dominion member setting %s %s", dominion.getName(), p_player.getLastKnownName()));
Button remove = Button.createRed("移除") Button remove = Button.createRed(Translation.TUI_MemberList_RemoveButton)
.setHoverText("将此成员移出(变为访客)") .setHoverText(Translation.TUI_MemberList_RemoveDescription)
.setExecuteCommand(CommandParser("/dominion member remove %s %s", dominion.getName(), p_player.getLastKnownName())); .setExecuteCommand(CommandParser("/dominion member remove %s %s", dominion.getName(), p_player.getLastKnownName()));
if (!player.getUniqueId().equals(dominion.getOwner())) { if (!player.getUniqueId().equals(dominion.getOwner())) {
@ -93,12 +94,12 @@ public class MemberList {
} }
} }
if (disable) { if (disable) {
prev.setDisabled("你不是领地主人,无法编辑管理员权限"); prev.setDisabled(Translation.TUI_MemberList_NoPermissionSet);
remove.setDisabled("你不是领地主人,无法移除管理员"); remove.setDisabled(Translation.TUI_MemberList_NoPermissionRemove);
} }
} }
if (group != null) { if (group != null) {
prev.setDisabled(String.format("此成员属于权限组 %s 无法单独编辑权限", group.getName())); prev.setDisabled(String.format(Translation.TUI_MemberList_BelongToGroup.trans(), group.getNamePlain()));
} }
line.append(remove.build()); line.append(remove.build());
line.append(prev.build()); line.append(prev.build());
@ -109,11 +110,11 @@ public class MemberList {
} }
private static final TextComponent adminTag = Component.text("[A]", Style.style(TextColor.color(97, 97, 210))) private static final TextComponent adminTag = Component.text("[A]", Style.style(TextColor.color(97, 97, 210)))
.hoverEvent(Component.text("这是一个管理员")); .hoverEvent(Component.text(Translation.TUI_MemberList_AdminTag.trans()));
private static final TextComponent normalTag = Component.text("[N]", Style.style(TextColor.color(255, 255, 255))) private static final TextComponent normalTag = Component.text("[N]", Style.style(TextColor.color(255, 255, 255)))
.hoverEvent(Component.text("这是一个普通成员")); .hoverEvent(Component.text(Translation.TUI_MemberList_NormalTag.trans()));
private static final TextComponent banTag = Component.text("[B]", Style.style(TextColor.color(255, 67, 0))) private static final TextComponent banTag = Component.text("[B]", Style.style(TextColor.color(255, 67, 0)))
.hoverEvent(Component.text("这是一个黑名单成员")); .hoverEvent(Component.text(Translation.TUI_MemberList_BlacklistTag.trans()));
private static final TextComponent groupTag = Component.text("[G]", Style.style(TextColor.color(0, 185, 153))) private static final TextComponent groupTag = Component.text("[G]", Style.style(TextColor.color(0, 185, 153)))
.hoverEvent(Component.text("这个成员在一个权限组里")); .hoverEvent(Component.text(Translation.TUI_MemberList_GroupTag.trans()));
} }

View File

@ -1,9 +1,10 @@
package cn.lunadeer.dominion.tuis.dominion.manage.member; package cn.lunadeer.dominion.uis.tuis.dominion.manage.member;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.MemberDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -27,14 +28,14 @@ public class MemberSetting {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
if (args.length < 3) { if (args.length < 3) {
Notification.error(sender, "用法: /dominion member setting <领地名称> <玩家名称> [页码]"); Notification.error(sender, Translation.TUI_MemberSetting_Usage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
DominionDTO dominion = DominionDTO.select(args[2]); DominionDTO dominion = DominionDTO.select(args[2]);
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "领地 %s 不存在", args[2]); Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
return; return;
} }
if (noAuthToManage(player, dominion)) return; if (noAuthToManage(player, dominion)) return;
@ -43,39 +44,45 @@ public class MemberSetting {
ListView view = ListView.create(10, "/dominion member setting " + dominion.getName() + " " + playerName); ListView view = ListView.create(10, "/dominion member setting " + dominion.getName() + " " + playerName);
PlayerDTO playerDTO = PlayerDTO.select(playerName); PlayerDTO playerDTO = PlayerDTO.select(playerName);
if (playerDTO == null) { if (playerDTO == null) {
Notification.error(sender, "玩家 %s 不存在", playerName); Notification.error(sender, Translation.Messages_PlayerNotExist, playerName);
return; return;
} }
MemberDTO privilege = MemberDTO.select(playerDTO.getUuid(), dominion.getId()); MemberDTO privilege = MemberDTO.select(playerDTO.getUuid(), dominion.getId());
if (privilege == null) { if (privilege == null) {
Notification.warn(sender, "玩家 %s 不是领地 %s 的成员", playerName, dominion.getName()); Notification.warn(sender, Translation.Messages_PlayerNotMember, playerName, dominion.getName());
return; return;
} }
view.title("玩家 " + playerName + " 在领地 " + dominion.getName() + " 的权限设置"); view.title(String.format(Translation.TUI_MemberSetting_Title.trans(), playerName, dominion.getName()));
view.navigator( view.navigator(
Line.create() Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build()) .append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build()) .append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
.append(Button.create("成员列表").setExecuteCommand("/dominion member list " + dominion.getName()).build()) .append(Button.create(Translation.TUI_Navigation_MemberList).setExecuteCommand("/dominion member list " + dominion.getName()).build())
.append("成员权限") .append(Translation.TUI_Navigation_MemberSetting)
); );
view.add(Line.create().append(Button.createGreen("套用模板") view.add(Line.create().append(Button.createGreen(Translation.TUI_MemberSetting_ApplyTemplateButton)
.setHoverText("选择一个权限模板套用") .setHoverText(Translation.TUI_MemberSetting_ApplyTemplateDescription)
.setExecuteCommand("/dominion member select_template " + dominion.getName() + " " + playerName).build())); .setExecuteCommand("/dominion member select_template " + dominion.getName() + " " + playerName).build()));
if (privilege.getAdmin()) { if (privilege.getAdmin()) {
view.add(Line.create() view.add(Line.create()
.append(Button.createGreen("").setExecuteCommand( .append(Button.createGreen("").setExecuteCommand(
parseCommand(dominion.getName(), playerName, "admin", false, page) parseCommand(dominion.getName(), playerName, "admin", false, page)
).build()) ).build())
.append("管理员")); .append(
Component.text(Translation.Flags_admin_DisplayName.trans())
.hoverEvent(Component.text(Translation.Flags_admin_Description.trans()))
));
view.add(createOption(Flag.GLOW, privilege.getFlagValue(Flag.GLOW), playerName, dominion.getName(), page)); view.add(createOption(Flag.GLOW, privilege.getFlagValue(Flag.GLOW), playerName, dominion.getName(), page));
} else { } else {
view.add(Line.create() view.add(Line.create()
.append(Button.createRed("").setExecuteCommand( .append(Button.createRed("").setExecuteCommand(
parseCommand(dominion.getName(), playerName, "admin", true, page) parseCommand(dominion.getName(), playerName, "admin", true, page)
).build()) ).build())
.append("管理员")); .append(
Component.text(Translation.Flags_admin_DisplayName.trans())
.hoverEvent(Component.text(Translation.Flags_admin_Description.trans()))
));
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page)); view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page));
} }

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.tuis.dominion.manage.member; package cn.lunadeer.dominion.uis.tuis.dominion.manage.member;
import cn.lunadeer.dominion.controllers.PlayerController; import cn.lunadeer.dominion.controllers.PlayerController;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -22,7 +23,7 @@ public class SelectPlayer {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
if (args.length < 3) { if (args.length < 3) {
Notification.error(sender, "用法: /dominion member select_player <领地名称> [页码]"); Notification.error(sender, Translation.TUI_SelectPlayer_Usage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
@ -31,10 +32,10 @@ public class SelectPlayer {
String dominion_name = args[2]; String dominion_name = args[2];
ListView view = ListView.create(10, "/dominion member select_player " + dominion_name); ListView view = ListView.create(10, "/dominion member select_player " + dominion_name);
Line sub = Line.create() Line sub = Line.create()
.append("只能选择已经登录过的玩家") .append(Translation.TUI_SelectPlayer_Description)
.append(Button.create("搜索").setExecuteCommand("/dominion cui_member_add " + dominion_name).build()) .append(Button.create(Translation.TUI_SearchButton).setExecuteCommand("/dominion cui_member_add " + dominion_name).build())
.append(Button.create("返回").setExecuteCommand("/dominion member list " + dominion_name).build()); .append(Button.create(Translation.TUI_BackButton).setExecuteCommand("/dominion member list " + dominion_name).build());
view.title("选择玩家添加为成员").subtitle(sub); view.title(Translation.TUI_SelectPlayer_Title).subtitle(sub);
List<PlayerDTO> players = PlayerController.allPlayers(); List<PlayerDTO> players = PlayerController.allPlayers();
for (PlayerDTO p : players) { for (PlayerDTO p : players) {
if (p.getUuid() == player.getUniqueId()) { if (p.getUuid() == player.getUniqueId()) {

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.tuis.dominion.manage.member; package cn.lunadeer.dominion.uis.tuis.dominion.manage.member;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -20,7 +21,7 @@ public class SelectTemplate {
public static void show(CommandSender sender, String[] args) { public static void show(CommandSender sender, String[] args) {
if (args.length < 4) { if (args.length < 4) {
// /dominion member select_template <领地名称> <玩家名称> [页码] // /dominion member select_template <领地名称> <玩家名称> [页码]
Notification.error(sender, "用法: /dominion member select_template <领地名称> <玩家名称> [页码]"); Notification.error(sender, Translation.TUI_SelectTemplate_Usage);
return; return;
} }
@ -36,16 +37,16 @@ public class SelectTemplate {
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
ListView view = ListView.create(10, "/dominion member select_template " + dominionName + " " + playerName); ListView view = ListView.create(10, "/dominion member select_template " + dominionName + " " + playerName);
view.title("选择一个模板"); view.title(Translation.TUI_SelectTemplate_Title);
Line sub = Line.create() Line sub = Line.create()
.append("套用在领地 " + dominionName + " 的成员 " + playerName + " 身上") .append(String.format(Translation.TUI_SelectTemplate_Description.trans(), dominionName, playerName))
.append(Button.create("返回").setExecuteCommand("/dominion member setting " + dominionName + " " + playerName).build()); .append(Button.create(Translation.TUI_BackButton).setExecuteCommand("/dominion member setting " + dominionName + " " + playerName).build());
view.subtitle(sub); view.subtitle(sub);
for (PrivilegeTemplateDTO template : templates) { for (PrivilegeTemplateDTO template : templates) {
// /dominion member apply_template <领地名称> <成员名称> <模板名称> // /dominion member apply_template <领地名称> <成员名称> <模板名称>
view.add(Line.create() view.add(Line.create()
.append(Button.create("选择") .append(Button.create(Translation.TUI_SelectButton)
.setExecuteCommand(CommandParser("/dominion member apply_template %s %s %s", dominionName, playerName, template.getName())) .setExecuteCommand(CommandParser("/dominion member apply_template %s %s %s", dominionName, playerName, template.getName()))
.build()) .build())
.append(Component.text(template.getName()))); .append(Component.text(template.getName())));

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.tuis.template; package cn.lunadeer.dominion.uis.tuis.template;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line; import cn.lunadeer.minecraftpluginutils.stui.components.Line;
@ -29,17 +30,17 @@ public class TemplateList {
ListView view = ListView.create(10, "/dominion template list"); ListView view = ListView.create(10, "/dominion template list");
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId()); List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
view.title("成员权限模板列表"); view.title(Translation.TUI_TemplateList_Title);
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("模板列表")); view.navigator(Line.create().append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build()).append(Translation.TUI_Navigation_TemplateList));
Button create = Button.create("创建成员权限模板").setExecuteCommand("/dominion cui_template_create") Button create = Button.create(Translation.TUI_TemplateList_CreateButton).setExecuteCommand("/dominion cui_template_create")
.setHoverText("创建一个新的成员权限模板"); .setHoverText(Translation.TUI_TemplateList_CreateDescription);
view.add(Line.create().append(create.build())); view.add(Line.create().append(create.build()));
for (PrivilegeTemplateDTO template : templates) { for (PrivilegeTemplateDTO template : templates) {
Button manage = Button.createGreen("配置").setExecuteCommand("/dominion template setting " + template.getName()); Button manage = Button.createGreen(Translation.TUI_EditButton).setExecuteCommand("/dominion template setting " + template.getName());
Button delete = Button.createRed("删除").setExecuteCommand("/dominion template delete " + template.getName()); Button delete = Button.createRed(Translation.TUI_DeleteButton).setExecuteCommand("/dominion template delete " + template.getName());
Line line = Line.create() Line line = Line.create()
.append(delete.build()) .append(delete.build())
.append(manage.build()) .append(manage.build())

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.tuis.template; package cn.lunadeer.dominion.uis.tuis.template;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO; import cn.lunadeer.dominion.dtos.PrivilegeTemplateDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button; import cn.lunadeer.minecraftpluginutils.stui.components.Button;
@ -30,16 +31,16 @@ public class TemplateSetting {
int page = getPage(args, 3); int page = getPage(args, 3);
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[2]); PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[2]);
if (template == null) { if (template == null) {
Notification.error(sender, "模板 %s 不存在", args[2]); Notification.error(sender, Translation.Messages_TemplateNotExist, args[2]);
return; return;
} }
ListView view = ListView.create(10, "/dominion template setting " + template.getName()); ListView view = ListView.create(10, "/dominion template setting " + template.getName());
view.title("模板 " + args[1] + " 权限管理"); view.title(String.format(Translation.TUI_TemplateSetting_Title.trans(), args[1]));
view.navigator(Line.create() view.navigator(Line.create()
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()) .append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
.append(Button.create("模板列表").setExecuteCommand("/dominion template list").build()) .append(Button.create(Translation.TUI_Navigation_TemplateList).setExecuteCommand("/dominion template list").build())
.append("模板管理") .append(Translation.TUI_Navigation_TemplateSetting)
); );
// /dominion template_set_flag <模板名称> <权限名称> <true/false> [页码] // /dominion template_set_flag <模板名称> <权限名称> <true/false> [页码]
@ -47,11 +48,17 @@ public class TemplateSetting {
if (template.getAdmin()) { if (template.getAdmin()) {
view.add(Line.create() view.add(Line.create()
.append(Button.createGreen("").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin false " + page).build()) .append(Button.createGreen("").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin false " + page).build())
.append("管理员")); .append(
Component.text(Translation.Flags_admin_DisplayName.trans())
.hoverEvent(Component.text(Translation.Flags_admin_Description.trans()))
));
} else { } else {
view.add(Line.create() view.add(Line.create()
.append(Button.createRed("").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin true " + page).build()) .append(Button.createRed("").setExecuteCommand("/dominion template set_flag " + template.getName() + " admin true " + page).build())
.append("管理员")); .append(
Component.text(Translation.Flags_admin_DisplayName.trans())
.hoverEvent(Component.text(Translation.Flags_admin_Description.trans()))
));
} }
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) { for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
view.add(createOption(flag, template.getFlagValue(flag), template.getName(), page)); view.add(createOption(flag, template.getFlagValue(flag), template.getName(), page));

View File

@ -7,12 +7,6 @@ import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.dtos.GroupDTO; import cn.lunadeer.dominion.dtos.GroupDTO;
import cn.lunadeer.dominion.dtos.MemberDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style;
import net.kyori.adventure.text.format.TextColor;
import net.kyori.adventure.text.format.TextDecoration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
@ -77,11 +71,9 @@ public class EventUtils {
return true; return true;
} }
} }
TextComponent msg = Component.text( String msg = String.format(Translation.Messages_NoPermissionForFlag.trans(), flag.getDisplayName(), flag.getDescription());
String.format(Translation.Messages_NoPermissionForFlag.trans(), flag.getDisplayName(), flag.getDescription()), msg = "&#FF0000" + "&l" + msg;
Style.style(TextColor.color(0xFF0000), TextDecoration.BOLD)) MessageDisplay.show(player, Dominion.config.getMessageDisplayNoPermission(), msg);
.hoverEvent(Component.text(flag.getDescription()));
Notification.actionBar(player, msg);
if (event != null) { if (event != null) {
event.setCancelled(true); event.setCancelled(true);
} }

View File

@ -0,0 +1,37 @@
package cn.lunadeer.dominion.utils;
import cn.lunadeer.minecraftpluginutils.ColorParser;
import cn.lunadeer.minecraftpluginutils.Notification;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class MessageDisplay {
public enum Place {
BOSS_BAR,
ACTION_BAR,
TITLE,
SUBTITLE,
CHAT
}
public static void show(Player player, Place place, String message) {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
message = PlaceholderAPI.setPlaceholders(player, message);
}
message = ColorParser.getBukkitType(message);
// BOSS_BAR, ACTION_BAR, TITLE, SUBTITLE, CHAT
if (place == Place.BOSS_BAR) {
Notification.bossBar(player, message);
} else if (place == Place.CHAT) {
player.sendMessage(message);
} else if (place == Place.TITLE) {
Notification.title(player, message);
} else if (place == Place.SUBTITLE) {
Notification.subTitle(player, message);
} else {
Notification.actionBar(player, message);
}
}
}

View File

@ -6,7 +6,6 @@ import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.stui.ListView; import cn.lunadeer.minecraftpluginutils.stui.ListView;
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
import cn.lunadeer.minecraftpluginutils.stui.components.Line; import cn.lunadeer.minecraftpluginutils.stui.components.Line;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -57,7 +56,7 @@ public class TuiUtils {
public static boolean notOp(CommandSender sender) { public static boolean notOp(CommandSender sender) {
if (!sender.isOp()) { if (!sender.isOp()) {
Notification.error(sender, "你没有权限访问此页面"); Notification.error(sender, Translation.Messages_PageNoPermission);
return true; return true;
} }
return false; return false;

View File

@ -1,7 +1,8 @@
package cn.lunadeer.dominion.utils.map; package cn.lunadeer.dominion.utils.map;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.api.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
@ -21,7 +22,7 @@ public class BlueMapConnect {
try { try {
BlueMapAPI.getInstance().ifPresent(api -> { BlueMapAPI.getInstance().ifPresent(api -> {
Map<String, List<DominionDTO>> world_dominions = new HashMap<>(); Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
for (DominionDTO dominion : Cache.instance.getDominions()) { for (DominionDTO dominion : Cache.instance.getAllDominions()) {
if (dominion.getWorld() == null) { if (dominion.getWorld() == null) {
continue; continue;
} }
@ -37,6 +38,11 @@ public class BlueMapConnect {
.build(); .build();
for (DominionDTO dominion : d.getValue()) { for (DominionDTO dominion : d.getValue()) {
PlayerDTO p = PlayerDTO.select(dominion.getOwner());
if (p == null) {
continue;
}
Collection<Vector2d> vectors = new ArrayList<>(); Collection<Vector2d> vectors = new ArrayList<>();
vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ1() + 0.001)); vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ1() + 0.001));
vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ1() + 0.001)); vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ1() + 0.001));
@ -55,6 +61,7 @@ public class BlueMapConnect {
Color fill = new Color(r, g, b, 0.2F); Color fill = new Color(r, g, b, 0.2F);
ExtrudeMarker marker = ExtrudeMarker.builder() ExtrudeMarker marker = ExtrudeMarker.builder()
.label(dominion.getName()) .label(dominion.getName())
.detail(String.format(Translation.Messages_MapInfoDetail.trans(), dominion.getName(), p.getLastKnownName()))
.position(x, y, z) .position(x, y, z)
.shape(shape, dominion.getY1() + 0.001f, dominion.getY2() - 0.001f) .shape(shape, dominion.getY1() + 0.001f, dominion.getY2() - 0.001f)
.lineColor(line) .lineColor(line)

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.utils.map; package cn.lunadeer.dominion.utils.map;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.api.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
@ -40,7 +41,11 @@ public class DynmapConnect extends DynmapCommonAPIListener {
} }
private void setDominionMarker(DominionDTO dominion) { private void setDominionMarker(DominionDTO dominion) {
String nameLabel = "<div>" + dominion.getName() + "</div>"; PlayerDTO p = PlayerDTO.select(dominion.getOwner());
if (p == null) {
return;
}
String nameLabel = String.format(Translation.Messages_MapInfoDetail.trans(), dominion.getName(), p.getLastKnownName());
double[] xx = {dominion.getX1(), dominion.getX2()}; double[] xx = {dominion.getX1(), dominion.getX2()};
double[] zz = {dominion.getZ1(), dominion.getZ2()}; double[] zz = {dominion.getZ1(), dominion.getZ2()};
if (dominion.getWorld() == null) { if (dominion.getWorld() == null) {

View File

@ -14,7 +14,7 @@ public class MapRender {
} }
if (Dominion.config.getDynmap()) { if (Dominion.config.getDynmap()) {
DynmapConnect.instance.setDominionMarkers(Cache.instance.getDominions()); DynmapConnect.instance.setDominionMarkers(Cache.instance.getAllDominions());
} }
} }

View File

@ -9,19 +9,42 @@ Database:
Language: zh-cn Language: zh-cn
AutoCreateRadius: 10 AutoCreateRadius: 10
DefaultJoinMessage: '&3{OWNER}: Welcome to {DOM}!'
DefaultLeaveMessage: '&3{OWNER}: Leaving {DOM}...'
MessageDisplay:
NoPermission: ACTION_BAR
JoinLeave: ACTION_BAR
Limit: Limit:
SpawnProtection: 10 SpawnProtection: 10
MinY: -64 MinY: -64
MaxY: 320 MaxY: 320
SizeX: 128 Size:
SizeY: 64 MaxX: 128
SizeZ: 128 MaxY: 64
MaxZ: 128
MinX: 4
MinY: 4
MinZ: 4
Amount: 10 Amount: 10
Depth: 3 Depth: 3
Vert: false Vert: false
WorldBlackList: [ ]
OpByPass: true OpByPass: true
WorldSettings:
some_world_name:
MinY: -64
MaxY: 320
Size:
MaxX: 128
MaxY: 64
MaxZ: 128
MinX: 4
MinY: 4
MinZ: 4
Amount: 10
Depth: 3
Vert: false
Teleport: Teleport:
Enable: true Enable: true
@ -32,6 +55,8 @@ AutoCleanAfterDays: 180
Tool: ARROW Tool: ARROW
InfoTool: STRING
Economy: Economy:
Enable: false Enable: false
Price: 10.0 Price: 10.0

View File

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

View File

@ -3,10 +3,12 @@ version: @version@
main: cn.lunadeer.dominion.Dominion main: cn.lunadeer.dominion.Dominion
api-version: '1.20' api-version: '1.20'
folia-supported: true folia-supported: true
libraries: [ ]
softdepend: softdepend:
- Vault - Vault
- dynmap - dynmap
- PlaceholderAPI - PlaceholderAPI
- BlueMap
commands: commands:
Dominion: Dominion:
description: 领地插件命令 description: 领地插件命令
@ -18,4 +20,4 @@ permissions:
default: op default: op
dominion.default: dominion.default:
description: 领地插件用户权限 description: 领地插件用户权限
default: true default: true

5
docs/LANGS.md Normal file
View File

@ -0,0 +1,5 @@
# Languages
* [中文(简体)](zh-cn/)
* [中文(繁體)](zh-hk/)
* [English](en-us/)

21
docs/book.json Normal file
View File

@ -0,0 +1,21 @@
{
"plugins": [
"chapter-fold",
"sidebar-style",
"code",
"github"
],
"pluginsConfig": {
"sidebar-style": {
"title": "Dominion",
"author": "zhangyuheng"
},
"code": {
"lineNumbers": true,
"copyButtons": true
},
"github": {
"url": "https://github.com/ColdeZhang/Dominion"
}
}
}

39
docs/en-us/README.md Normal file
View File

@ -0,0 +1,39 @@
## Dominion Documentation
[![GitHub Repository](https://img.shields.io/badge/SourceCode-GitHub-blue?logo=github)](https://github.com/ColdeZhang/Dominion)
[![bStats](https://img.shields.io/badge/bStats-Statistics-eacd76?logo=google-analytics)](https://bstats.org/plugin/bukkit/Dominion/21445)
[![Hangar](https://img.shields.io/badge/To-Hangar-004ee9)](https://hangar.papermc.io/zhangyuheng/Dominion)
[![Modrinth](https://img.shields.io/badge/To-Modrinth-1bd96a)](https://modrinth.com/plugin/zhangyuheng-dominion)
[![Spigot](https://img.shields.io/badge/To-Spigot-ed8106)](https://www.spigotmc.org/resources/dominion.119514/)
[![Latest Build](https://img.shields.io/github/v/release/ColdeZhang/Dominion?label=LatestBuild&logo=github&color=0aa344)](https://github.com/ColdeZhang/Dominion/releases/latest)
## Brief
First of all, thank you very much for choosing and using this plugin.
Dominion is a completely open-source, free, future-proof, territory anti-grief plugin developed specifically for
high-versions minecraft server. The plugin is currently undergoing rapid development and iteration, and we will do our
best to ensure the stability and functionality of the plugin.
If you encounter any problems during use, or have any suggestions, please feel free to submit your questions or ideas
at [GitHub ISSUE](https://github.com/ColdeZhang/Dominion/issues).
## Quick start (for players)
1. [How to create a dominion](create-dominion.md)
2. [Managing your dominion](manage-dominion/README.md)
## Quick start (for server administrators)
1. [Installation, Required Readings, FAQ](operator/README.md)
2. [Configuration File Reference](operator/config.md)
## Help translate this documentation
If you want to help us translate the documentation, please refer
to [CONTRIBUTING.md](https://github.com/ColdeZhang/Dominion/blob/master/CONTRIBUTING.md#translate-documentation).
❤ Thank you for your support and contribution! ❤

24
docs/en-us/SUMMARY.md Normal file
View File

@ -0,0 +1,24 @@
# Summary
* [Preface](README.md)
* [Creating a Dominion](README.md)
* [Territory Management](manage-dominion/README.md)
* [Environment Settings](manage-dominion/environment.md)
* [Permission Management](manage-dominion/permission/README.md)
* [Guest Permissions](manage-dominion/permission/guest.md)
* [Territory members](manage-dominion/permission/member.md)
* [Permission Groups](manage-dominion/permission/permission-group.md)
* [Permission Templates](manage-dominion/permission/template.md)
* [Territory Teleport](manage-dominion/teleport.md)
* [Resize](manage-dominion/resize.md)
* [Setting the territory reminder message](manage-dominion/message.md)
* [Permission group title](manage-dominion/group-title.md)
* [Subdominion](manage-dominion/sub-dominion.md)
* [Migration from residence](migration-residence.md)
* [Command list](command-list.md)
* [Administrator's Guide](operator/README.md)
* [Configuration file reference](operator/config.md)
* [flags.yml](operator/flags.md)
* [Privileged Player Configuration](operator/privilege.md)
* [Cross-group teleportation (global-tp in testing)](operator/global-tp.md)
* [Developer](developer.md)

View File

@ -0,0 +1 @@
# 指令列表

View File

@ -0,0 +1,23 @@
# 创建领地
## 名称规则
- 领地名称不可与其他领地重复;
- 领地名称不可包含空格;
- 领地名称不可包含特殊字符;
## 手动创建
需要使用圈地工具(默认为箭矢),依次使用左键点选领地长方体区域的第一个点、右键点击长方体区域的第二个点。然后使用:
`/dominion create <领地名称>`创建领地,领地名称不可与其他领地重复。
## 自动创建
不需要选择对角线点,会以玩家为中心自动创建一定区域的领地。
1. 使用 `/dominion` 打开主菜单,点击`【创建领地】`;
2. 在弹出的 UI 中输入你要创建的领地名称;
3. 输入完成后左键点击下方中间的绿色混凝土,即可自动创建一块领地;
> 自动创建半径是由服务器管理员在配置文件中设置的;

99
docs/en-us/developer.md Normal file
View File

@ -0,0 +1,99 @@
# 开发者文档
> DominionAPI 自 Dominion-2.9.0-beta 开始支持。
## 一、接入 DominionAPI
### 1. 引入依赖
如果您使用 gradle可以在您的 `build.gradle` 文件中添加如下代码:
```groovy
// build.gradle
repositories {
maven { url = "https://ssl.lunadeer.cn:14454/repository/maven-snapshots/" }
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:2.1-SNAPSHOT")
}
```
或者你使用的是 gradle kotlin dsl
```kotlin
// build.gradle.kts
repositories {
maven("https://ssl.lunadeer.cn:14454/repository/maven-snapshots/")
}
dependencies {
compileOnly("cn.lunadeer:DominionAPI:2.1-SNAPSHOT")
}
```
再或者您使用 maven可以在您的 `pom.xml` 文件中添加如下代码:
```xml
<!-- pom.xml -->
<repositories>
<repository>
<id>lunadeer</id>
<url>https://ssl.lunadeer.cn:14454/repository/maven-snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>cn.lunadeer</groupId>
<artifactId>DominionAPI</artifactId>
<version>2.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
```
### 2. plugin.yml 配置
在您的插件的 `plugin.yml` 文件中添加如下配置,以确保在 Dominion 准备完成后再加载您的插件:
```yaml
# plugin.yml
depend: [ Dominion ]
```
## 二、使用 DominionAPI
可以通过如下方法直接获取 DominionAPI 实例:
```java
import cn.lunadeer.dominion.api.Dominion;
import cn.lunadeer.dominion.api.DominionAPI;
DominionAPI dominionAPI = Dominion.getInstance();
```
例如,获取某个位置的领地信息:
```java
@Override
public void onEnable() {
// Plugin startup logic
try {
DominionAPI dominionAPI = Dominion.getInstance();
DominionDTO d = dominionAPI.getDominionByLoc(some_location);
if (d == null) {
this.getLogger().info("no dominion found");
return;
}
this.getLogger().info("name:" + d.getName());
} catch (Exception e) {
this.getLogger().info(e.getMessage());
}
}
```
[示例项目地址](https://github.com/ColdeZhang/DominionAddonExample)。
[Javadoc地址](https://coldezhang.github.io/DominionAPI/)。

View File

@ -0,0 +1,14 @@
# 领地管理
领地的管理可以通过领地菜单完成,通常来说您不需要任何指令就可以完成领地的管理。
## 主菜单界面 `/dominion`
使用 `/dominion` 可以打开领地系统的可视化操作菜单界面TUI。单击`【我的领地】`可以查看自己创建的所有领地。
## 领地管理界面 `/dominion manage [领地名称]`
单击对应领地的【管理】即可进入对应领地的管理界面,通过管理界面可以管理此领地的权限等信息。 也可以直接输入
`/dominion manage [领地名称]` 来快速打开当前所在领地的管理界面。
> 领地名称是可选的,不填写则自动打开你当前所在的领地管理界面。

View File

@ -0,0 +1,16 @@
# 环境设置
## 简介
领地环境设置主要包含了领地内的一些非玩家行为的设置例如TNT爆炸、火焰蔓延等等。
## 设置方法
1. 打开领地菜单 `/dominion`
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`
3. 在领地管理界面中选择 `【环境设置】`
4. 点击对应设置项的权限前的 ☑/☐ 来允许或者禁止对应的领地环境行为。
## 注意事项
- 鼠标移动到权限名称上可以显示此权限的详细(描述)信息;

View File

@ -0,0 +1,26 @@
# 权限组称号
## 简介
权限组称号可以用来对外展示玩家在领地的角色/地位/身份,有利于提高领地内的社交性、增强玩家的归属感。
## 领地主要做的事
参照文档完成领地[权限组的配置](permission/permission-group.md),并且添加对应成员;
> 领地主玩家可以使用自己领地的所有权限组称号,所以如果领地主想给自己一个称号可以建一个空权限组专门用来给自己作称号用。
## 成员玩家要做的事
1. 打开领地菜单 `/dominion`
2. 在主菜单点击`【称号列表】`,此处会列出所有你拥有的领地权限组称号,以及该称号来源于哪个领地:
3. 点击对应称号前的【使用】,即可;
## 管理员要做的事
1. 在配置文件中启用 `GroupTitle.Enable`
2. 安装 PlaceholderAPI 插件;
3. 在你想要显示称号的地方如聊天前缀、TAB列表添加占位符`%dominion_group_title%`
> 通常来说你还需要安装一个聊天插件来显示占位符,例如 InteractiveChat、TAB 之类的。

View File

@ -0,0 +1,17 @@
# 领地提示消息
## 进入消息
可以为领地设置玩家进入时的欢迎语句,提示语将在玩家进入领地时弹出。
```
/dominion set_enter_msg <提示语> [领地名称]
```
## 离开消息
可以为领地设置玩家离开时的欢送语句,提示语将在玩家离开领地时弹出。
```
/dominion set_leave_msg <提示语> [领地名称]
```

View File

@ -0,0 +1,53 @@
# 权限管理
## 简介
Dominion 采用了 `访客-成员-权限组` 的权限管理模型。通过此方案既可以满足对于权限的细粒度控制,又可以保证权限的可维护性,减轻玩家的操作负担。
- [访客](guest):领地的访客权限,不属于领地成员的玩家将收到此权限的限制;
- [成员](member.md):领地的成员权限,属于领地成员的玩家将收到此权限的限制;
- [权限组](permission-group.md):领地的权限组,将玩家添加到权限组中,可以为多个玩家配置相同的权限;
## 权限模型透视
```
┌───────────┐
│ Player │
└─────┬─────┘
┌───────────┐ ┌───────────┐
│ IsMember? │───►│ HasGroup? │
└─────┬─────┘ Y └──┬────┬───┘
│N │ │
▼ │ │
┌───────────┐ N│ Y│
│ Visitor │ │ │
└───────────┘ │ │
┌───────────┐ │ │
│ Member │◄──────┘ │
└───────────┘ │
┌───────────┐ │
│ Group │◄───────────┘
└───────────┘
```
- 当一个玩家不属于领地成员时将收到访客权限的限制;
- 如果是领地成员那么会判断玩家是否属于权限组;
- 如果玩家属于权限组那么将收到对应权限组的行为控制;
- 如果玩家不属于权限组那么将采用该玩家在此领地中的成员权限;
## 领地管理员
管理员是领地成员权限中的一个特殊权限:
- ✅管理员可以做的事:
- 该领地的其他所有权限
- 修改领地权限
- 修改领地的玩家权限(添加、删除、修改)
- ❌管理员不可以做的事:
- 删除领地
- 修改领地尺寸
- 将其他玩家设置为管理员
通过将一些玩家设置为管理员,可以让他们帮助你管理领地的其他玩家,减轻领地所有人的操作负担。同时不必担心管理员会对领地进行破坏性操作(例如删除、缩小领地)。

View File

@ -0,0 +1,19 @@
# 访客权限
## 简介
访客是相对于领地成员而言的,通过设置访客权限,你可以控制非领地成员的玩家在领地内的行为。
例如:如果你是个大好人希望提供公共物资给服务器内的其他玩家使用,那么你可以将该领地访客权限中的【容器】权限打开。
这样其他玩家就可以在你的领地内使用你的箱子了,无需给他们领地成员的权限。
## 设置方法
1. 打开领地菜单 `/dominion`
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`
3. 在领地管理界面中选择 `【访客权限】`
4. 点击对应设置项的权限前的 ☑/☐ 来允许或者禁止对应的领地环境行为。
## 封禁一个玩家?
Dominion自身并没有直接提供封禁玩家的功能但是你可以通过将玩家添加为领地成员然后关闭他的【移动】权限来实现类似的效果。具体操作请参考[领地成员](member.md)。

View File

@ -0,0 +1,32 @@
# 领地成员
## 简介
顾名思义。
## 添加成员
1. 打开领地菜单 `/dominion`
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`
3. 在领地管理界面中选择 `【成员管理】`
4. 点击 `【添加成员】`,选择或输入玩家名称添加为领地成员。
## 管理成员
1. 打开领地菜单 `/dominion`
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`
3. 在领地管理界面中选择 `【成员管理】`,此处列出了领地的所有成员;
- 点击 `【配置权限】` 可以配置此成员在领地内的权限;
- 点击 `【移除成员】` 可以将此成员移出领地;
- 如果一个玩家属于某[权限组](permission-group.md),那么你不能单独编辑他的权限,对应`【配置权限】`为灰色不可点击;
玩家名称最前方标记含义:
- 【A】该领地管理员
- 【N】普通成员
- 【B】黑名单成员没有移动权限
- 【G】属于某个权限组
## 注意事项
- 选择成员页面只会显示在安装了Dominion后登录过服务器的玩家名称因此暂时不支持对从没有在服务器登录过的玩家进行操作。
- 通过搜索框添加成员不支持模糊搜索,需要输入准确的玩家名称(大小写敏感)。

View File

@ -0,0 +1,51 @@
# 权限组
## 简介
权限组可以对一批玩家的权限进行统一的管理、设置,减少大量重复的操作,提高效率。
## 创建权限组
1. 打开领地菜单 `/dominion`
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`
3. 在领地管理界面中选择 `【权限组】`
4. 点击 `【创建权限组】`,输入权限组名称,左键点击绿色混凝土完成创建;
## 权限组成员管理
权限组成员只能是领地成员,因此需要**先将玩家添加为领地成员**,才能将其编入权限组。
- 添加成员:点击权限组后面的`【+】`,选择领地成员;
- 移除成员:点击玩家名字前面的`【-】`
## 管理权限组
- 编辑权限组:点击权限组前的`【编辑】`,配置此权限组的权限或修改权限组的名称;
- 删除权限组:点击权限组前的`【删除】`,删除此权限组;
- 配置权限:在编辑页面,点击对应权限前的 ☑/☐ 来允许或者禁止该权限组内的玩家的行为;
> 注意:删除权限组后,权限组内的成员会被自动移出权限组,成为领地普通成员。
## 其他
- 权限组名称同时也可以作为称号,用来对外展示玩家在领地的角色/地位/身份,详见[权限组称号](../group-title.md)
- 权限组名称支持 RGB 彩色效果,详情参见 [彩色字符](https://ssl.lunadeer.cn:14448/doc/81/)
## Q&A 常见问题
Q我将玩家 A 编入了权限组 G还可以手动设置 A 的成员权限吗?
A不可以编入权限组 G 后此玩家的行为只能由此权限组控制。
---
Q我将玩家 A 编入了权限组 G1还能再编入权限组 G2 吗?
A不可以在一个领地内一个玩家只能属于一个权限组不支持混合。
---
Q我将玩家 A 编入了权限组 G然后一不小心删除了权限组 G 会发生生么?
A玩家会被自动移出权限组成为领地一般成员。

View File

@ -0,0 +1,37 @@
# 权限模板
权限模板功能允许你预先配置好一组权限,然后直接将模板套用到成员身上,即可快速将此成员的权限设置为理想的状态。相比于权限组,模板主要适用于某些特殊的、非通用的权限组和。
例如:你并不喜欢权限组的统一性,你希望每个成员都有自己的权限设置,但是又不想每次都手动设置,这时候权限模板就派上用场了。
## 创建一个模板
1. 打开领地菜单 `/dominion`
2. 在主菜单点击`【权限模板】`
3. 点击`【创建成员权限模板】`,输入模板名称,点击绿色混凝土完成创建;
4. 点击模板前的`【管理】`,配置此模板的权限;
## 使用模板
1. 打开领地菜单 `/dominion`
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`
3. 在领地管理界面中选择 `【成员管理】`,此处列出了领地的所有成员;
4. 点击 `【配置权限】` 后,点击 `【套用模板】`
5. 在列表中点击你想要使用的模板,完成权限模板的套用;
## Q&A 常见问题
Q我将模板 T 套用在了玩家 A 身上,还可以手动设置 A 的成员权限吗?
A可以。
---
Q我将模板 T 套用在了玩家 A 身上,修改玩家 A 的权限会同步修改模板 T 的权限吗?
A不会模板应用是单向的。
---
Q我将模板 T 套用在了玩家 A 身上,修改模板 T 的权限会同步修改玩家 A 的权限吗?
A不会模板应用是一次性的类似于批量处理不会产生连锁影响。

View File

@ -0,0 +1,23 @@
# 修改领地尺寸
## 扩大
面向想要扩大的方向,使用命令:
```
/dominion expand [大小] [领地名称]
```
- 大小可选默认为10
- 领地名称:可选,默认为当前所在领地,如果在子领地内则需要指定领地名称;
## 缩小
面向想要缩小的方向,使用命令:
```
/dominion contract [大小] [领地名称]
```
- 大小可选默认为10
- 领地名称:可选,默认为当前所在领地,如果在子领地内则需要指定领地名称;

Some files were not shown because too many files have changed in this diff Show More