Compare commits

..

124 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
d038d77fa4 修复了 spigot 无法使用权限组称号的问题 2024-09-03 17:37:47 +08:00
34a64d3826 更新工具库 2024-09-03 17:19:14 +08:00
4355915081 完成了大部分内容的i18n 2024-09-03 15:33:59 +08:00
2ecab82905 完成了 GroupController i18n 2024-09-03 01:27:00 +08:00
8773fd35d2 完成了 DominionController i18n 2024-09-03 00:45:23 +08:00
7c09f09a85 完成了commands i18n 2024-09-02 22:19:35 +08:00
a6aef5fc95 完成了 config i18n 2024-09-02 19:54:33 +08:00
5794f28a33 完成了config的部分i18n 2024-09-02 17:45:45 +08:00
dbfe4f2963 尝试优雅地实现i18n国际化,完成了部分内容的国际化支持(待测试) 2024-09-02 02:19:16 +08:00
204 changed files with 10237 additions and 2023 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.4.2-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.7-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

@ -2,6 +2,7 @@ package cn.lunadeer.dominion;
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.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import java.util.List; import java.util.List;
@ -11,15 +12,15 @@ public class AutoClean {
if (Dominion.config.getAutoCleanAfterDays() < 0) { if (Dominion.config.getAutoCleanAfterDays() < 0) {
return; return;
} }
XLogger.info("开始自动清理长时间未登录玩家领地数据"); XLogger.info(Translation.Messages_AutoCleanStart);
int auto_clean_after_days = Dominion.config.getAutoCleanAfterDays(); int auto_clean_after_days = Dominion.config.getAutoCleanAfterDays();
List<PlayerDTO> players = PlayerController.allPlayers(); List<PlayerDTO> players = PlayerController.allPlayers();
for (PlayerDTO p : players) { for (PlayerDTO p : players) {
if (p.getLastJoinAt() + (long) auto_clean_after_days * 24 * 60 * 60 * 1000 < System.currentTimeMillis()) { if (p.getLastJoinAt() + (long) auto_clean_after_days * 24 * 60 * 60 * 1000 < System.currentTimeMillis()) {
PlayerDTO.delete(p); PlayerDTO.delete(p);
XLogger.info("已清理玩家 %s 的领地数据", p.getLastKnownName()); XLogger.info(Translation.Messages_AutoCleanPlayer, p.getLastKnownName());
} }
} }
XLogger.info("自动清理完成"); XLogger.info(Translation.Messages_AutoCleanEnd);
} }
} }

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.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,14 +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.tuis.*; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.DominionList; import cn.lunadeer.dominion.uis.cuis.*;
import cn.lunadeer.dominion.tuis.dominion.DominionManage; import cn.lunadeer.dominion.uis.tuis.AllDominion;
import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting; import cn.lunadeer.dominion.uis.tuis.Menu;
import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting; import cn.lunadeer.dominion.uis.tuis.MigrateList;
import cn.lunadeer.dominion.tuis.dominion.manage.SizeInfo; import cn.lunadeer.dominion.uis.tuis.TitleList;
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;
@ -114,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;
@ -215,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",
@ -237,9 +247,10 @@ public class Commands implements TabExecutor {
case "help": case "help":
case "list": case "list":
case "sys_config": case "sys_config":
return Collections.singletonList(Translation.Commands_PageOptional.trans());
case "create": case "create":
case "auto_create": case "auto_create":
return Collections.singletonList("输入领地名称"); return Collections.singletonList(Translation.Commands_DominionName.trans());
case "delete": case "delete":
case "info": case "info":
case "manage": case "manage":
@ -254,16 +265,16 @@ public class Commands implements TabExecutor {
return dominionFlags(); return dominionFlags();
case "expand": case "expand":
case "contract": case "contract":
return Collections.singletonList("大小(整数)"); return Collections.singletonList(Translation.Commands_SizeInteger.trans());
case "create_sub": case "create_sub":
case "auto_create_sub": case "auto_create_sub":
return Collections.singletonList("子领地名称"); return Collections.singletonList(Translation.Commands_SubDominionName.trans());
case "set_enter_msg": case "set_enter_msg":
return Collections.singletonList("进入提示语内容"); return Collections.singletonList(Translation.Commands_EnterMessageContent.trans());
case "set_leave_msg": case "set_leave_msg":
return Collections.singletonList("离开提示语内容"); return Collections.singletonList(Translation.Commands_LeaveMessageContent.trans());
case "set_map_color": case "set_map_color":
return Collections.singletonList("输入颜色(16进制)"); return Collections.singletonList(Translation.Commands_InputColor.trans());
} }
} }
if (args.length == 3) { if (args.length == 3) {
@ -279,7 +290,7 @@ public class Commands implements TabExecutor {
case "set_map_color": case "set_map_color":
return playerDominions(sender); return playerDominions(sender);
case "rename": case "rename":
return Collections.singletonList("输入新领地名称"); return Collections.singletonList(Translation.Commands_NewDominionName.trans());
case "give": case "give":
return playerNames(); return playerNames();
} }

View File

@ -3,8 +3,9 @@ package cn.lunadeer.dominion;
import cn.lunadeer.dominion.managers.ConfigManager; import cn.lunadeer.dominion.managers.ConfigManager;
import cn.lunadeer.dominion.managers.DatabaseTables; import cn.lunadeer.dominion.managers.DatabaseTables;
import cn.lunadeer.dominion.managers.PlaceHolderApi; import cn.lunadeer.dominion.managers.PlaceHolderApi;
import cn.lunadeer.dominion.utils.DynmapConnect; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.MapRender; import cn.lunadeer.dominion.utils.map.DynmapConnect;
import cn.lunadeer.dominion.utils.map.MapRender;
import cn.lunadeer.minecraftpluginutils.*; import cn.lunadeer.minecraftpluginutils.*;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager; import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
import cn.lunadeer.minecraftpluginutils.databse.DatabaseType; import cn.lunadeer.minecraftpluginutils.databse.DatabaseType;
@ -38,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("未找到 PlaceholderAPI 插件,无法使用权限组组称号功能,已自动关闭"); XLogger.warn(Translation.Messages_PlaceholderAPINotFound);
config.setGroupTitleEnable(false); config.setGroupTitleEnable(false);
}
} }
new EventsRegister(this); new EventsRegister(this);
@ -67,8 +68,8 @@ public final class Dominion extends JavaPlugin {
// SCUI 初始化 // SCUI 初始化
Bukkit.getPluginManager().registerEvents(new CuiManager(this), this); Bukkit.getPluginManager().registerEvents(new CuiManager(this), this);
XLogger.info("领地插件已启动"); XLogger.info(Translation.Messages_PluginEnabled);
XLogger.info("版本:" + this.getDescription().getVersion()); XLogger.info(Translation.Messages_PluginVersion, this.getDescription().getVersion());
// http://patorjk.com/software/taag/#p=display&f=Big&t=Dominion // http://patorjk.com/software/taag/#p=display&f=Big&t=Dominion
XLogger.info(" _____ _ _"); XLogger.info(" _____ _ _");
XLogger.info(" | __ \\ (_) (_)"); XLogger.info(" | __ \\ (_) (_)");

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

@ -3,8 +3,9 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.FlagsController; import cn.lunadeer.dominion.controllers.FlagsController;
import cn.lunadeer.dominion.dtos.Flag; import cn.lunadeer.dominion.dtos.Flag;
import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting; import cn.lunadeer.dominion.uis.tuis.dominion.manage.EnvSetting;
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;
@ -41,7 +42,7 @@ public class DominionFlag {
} }
} else { } else {
Notification.error(sender, "用法: /dominion set <权限名称> <true/false> [领地名称]"); Notification.error(sender, Translation.Commands_Dominion_SetFlagUsage);
} }
} }

View File

@ -8,6 +8,7 @@ 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.dtos.MemberDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.Teleport; import cn.lunadeer.minecraftpluginutils.Teleport;
@ -39,12 +40,12 @@ public class DominionOperate {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (args.length != 2) { if (args.length != 2) {
Notification.error(sender, "用法: /dominion create <领地名称>"); Notification.error(sender, Translation.Commands_Dominion_CreateDominionUsage);
return; return;
} }
Map<Integer, Location> points = Dominion.pointsSelect.get(player.getUniqueId()); Map<Integer, Location> points = Dominion.pointsSelect.get(player.getUniqueId());
if (points == null || points.get(0) == null || points.get(1) == null) { if (points == null || points.get(0) == null || points.get(1) == null) {
Notification.error(sender, "请先使用工具选择领地的对角线两点,或使用 /dominion auto_create <领地名称> 创建自动领地"); Notification.error(sender, Translation.Commands_Dominion_CreateSelectPointsFirst);
return; return;
} }
String name = args[1]; String name = args[1];
@ -66,12 +67,12 @@ public class DominionOperate {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (args.length != 2 && args.length != 3) { if (args.length != 2 && args.length != 3) {
Notification.error(sender, "用法: /dominion create_sub <子领地名称> [父领地名称]"); Notification.error(sender, Translation.Commands_Dominion_CreateSubDominionUsage);
return; return;
} }
Map<Integer, Location> points = Dominion.pointsSelect.get(player.getUniqueId()); Map<Integer, Location> points = Dominion.pointsSelect.get(player.getUniqueId());
if (points == null || points.get(0) == null || points.get(1) == null) { if (points == null || points.get(0) == null || points.get(1) == null) {
Notification.error(sender, "请先使用工具选择子领地的对角线两点,或使用 /dominion auto_create_sub <子领地名称> [父领地名称] 创建自动子领地"); Notification.error(sender, Translation.Commands_Dominion_CreateSubSelectPointsFirst);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(player); BukkitPlayerOperator operator = BukkitPlayerOperator.create(player);
@ -82,6 +83,8 @@ public class DominionOperate {
} }
} }
/** /**
* 自动创建领地 * 自动创建领地
* 会在玩家当前位置的周围创建一个领地 * 会在玩家当前位置的周围创建一个领地
@ -97,11 +100,11 @@ public class DominionOperate {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (args.length != 2) { if (args.length != 2) {
Notification.error(sender, "用法: /dominion auto_create <领地名称>"); Notification.error(sender, Translation.Commands_Dominion_AutoCreateDominionUsage);
return; return;
} }
if (Dominion.config.getAutoCreateRadius() < 0) { if (Dominion.config.getAutoCreateRadius() < 0) {
Notification.error(sender, "自动创建领地功能已关闭"); Notification.error(sender, Translation.Commands_Dominion_AutoCreateDominionDisabled);
return; return;
} }
autoPoints(player); autoPoints(player);
@ -123,17 +126,19 @@ public class DominionOperate {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (args.length != 2 && args.length != 3) { if (args.length != 2 && args.length != 3) {
Notification.error(sender, "用法: /dominion auto_create_sub <子领地名称> [父领地名称]"); Notification.error(sender, Translation.Commands_Dominion_AutoCreateSubDominionUsage);
return; return;
} }
if (Dominion.config.getAutoCreateRadius() < 0) { if (Dominion.config.getAutoCreateRadius() < 0) {
Notification.error(sender, "自动创建领地功能已关闭"); Notification.error(sender, Translation.Commands_Dominion_AutoCreateDominionDisabled);
return; return;
} }
autoPoints(player); autoPoints(player);
createSubDominion(sender, args); createSubDominion(sender, args);
} }
/** /**
* 扩张领地 * 扩张领地
* /dominion expand [大小] [领地名称] * /dominion expand [大小] [领地名称]
@ -148,7 +153,7 @@ public class DominionOperate {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (args.length != 2 && args.length != 3) { if (args.length != 2 && args.length != 3) {
Notification.error(sender, "用法: /dominion expand [大小] [领地名称]"); Notification.error(sender, Translation.Commands_Dominion_ExpandDominionUsage);
return; return;
} }
int size = 10; int size = 10;
@ -156,11 +161,11 @@ public class DominionOperate {
try { try {
size = Integer.parseInt(args[1]); size = Integer.parseInt(args[1]);
} catch (Exception e) { } catch (Exception e) {
Notification.error(sender, "大小格式错误"); Notification.error(sender, Translation.Commands_Dominion_SizeShouldBeInteger);
return; return;
} }
if (size <= 0) { if (size <= 0) {
Notification.error(sender, "大小必须大于0"); Notification.error(sender, Translation.Commands_Dominion_SizeShouldBePositive);
return; return;
} }
if (args.length == 3) { if (args.length == 3) {
@ -188,7 +193,7 @@ public class DominionOperate {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (args.length != 2 && args.length != 3) { if (args.length != 2 && args.length != 3) {
Notification.error(sender, "用法: /dominion contract [大小] [领地名称]"); Notification.error(sender, Translation.Commands_Dominion_ContractDominionUsage);
return; return;
} }
int size = 10; int size = 10;
@ -196,11 +201,11 @@ public class DominionOperate {
try { try {
size = Integer.parseInt(args[1]); size = Integer.parseInt(args[1]);
} catch (Exception e) { } catch (Exception e) {
Notification.error(sender, "大小格式错误"); Notification.error(sender, Translation.Commands_Dominion_SizeShouldBeInteger);
return; return;
} }
if (size <= 0) { if (size <= 0) {
Notification.error(sender, "大小必须大于0"); Notification.error(sender, Translation.Commands_Dominion_SizeShouldBePositive);
return; return;
} }
if (args.length == 3) { if (args.length == 3) {
@ -238,7 +243,7 @@ public class DominionOperate {
return; return;
} }
} }
Notification.error(sender, "用法: /dominion delete <领地名称>"); Notification.error(sender, Translation.Commands_Dominion_DeleteDominionUsage);
} }
/** /**
@ -261,7 +266,7 @@ public class DominionOperate {
DominionController.setJoinMessage(operator, args[1], args[2]); DominionController.setJoinMessage(operator, args[1], args[2]);
return; return;
} }
Notification.error(sender, "用法: /dominion set_enter_msg <提示语> [领地名称]"); Notification.error(sender, Translation.Commands_Dominion_SetEnterMessageUsage);
} }
/** /**
@ -284,7 +289,7 @@ public class DominionOperate {
DominionController.setLeaveMessage(operator, args[1], args[2]); DominionController.setLeaveMessage(operator, args[1], args[2]);
return; return;
} }
Notification.error(sender, "用法: /dominion set_leave_msg <提示语> [领地名称]"); Notification.error(sender, Translation.Commands_Dominion_SetLeaveMessageUsage);
} }
/** /**
@ -312,7 +317,7 @@ public class DominionOperate {
args[1]); args[1]);
return; return;
} }
Notification.error(sender, "用法: /dominion set_tp_location [领地名称]"); Notification.error(sender, Translation.Commands_Dominion_SetTpLocationUsage);
} }
/** /**
@ -328,7 +333,7 @@ public class DominionOperate {
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
if (args.length != 3) { if (args.length != 3) {
Notification.error(sender, "用法: /dominion rename <原领地名称> <新领地名称>"); Notification.error(sender, Translation.Commands_Dominion_RenameDominionUsage);
return; return;
} }
DominionController.rename(operator, args[1], args[2]); DominionController.rename(operator, args[1], args[2]);
@ -360,7 +365,7 @@ public class DominionOperate {
return; return;
} }
} }
Notification.error(sender, "用法: /dominion give <领地名称> <玩家名称>"); Notification.error(sender, Translation.Commands_Dominion_GiveDominionUsage);
} }
/** /**
@ -377,34 +382,34 @@ public class DominionOperate {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
if (args.length != 2) { if (args.length != 2) {
Notification.error(sender, "用法: /dominion tp <领地名称>"); Notification.error(sender, Translation.Commands_Dominion_TpDominionUsage);
return; return;
} }
DominionDTO dominionDTO = DominionDTO.select(args[1]); DominionDTO dominionDTO = DominionDTO.select(args[1]);
if (dominionDTO == null) { if (dominionDTO == null) {
Notification.error(sender, "领地不存在"); Notification.error(sender, Translation.Commands_Dominion_DominionNotExist);
return; return;
} }
if (player.isOp() && Dominion.config.getLimitOpBypass()) { if (player.isOp() && Dominion.config.getLimitOpBypass()) {
Notification.warn(sender, "你是OP将忽略领地传送限制"); Notification.warn(sender, Translation.Messages_OpBypassTpLimit);
Location location = dominionDTO.getTpLocation(); Location location = dominionDTO.getTpLocation();
if (location == null) { if (location == null) {
int x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2; int x = (dominionDTO.getX1() + dominionDTO.getX2()) / 2;
int z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2; int z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2;
World world = dominionDTO.getWorld(); World world = dominionDTO.getWorld();
if (world == null) { if (world == null) {
Notification.error(sender, "领地所在世界不存在"); Notification.error(sender, Translation.Messages_WorldNotExist);
return; return;
} }
location = new Location(world, x, player.getLocation().getY(), z); location = new Location(world, x, player.getLocation().getY(), z);
XLogger.warn("领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName()); XLogger.warn(Translation.Messages_NoTpLocation, dominionDTO.getName());
} }
Teleport.doTeleportSafely(player, location); Teleport.doTeleportSafely(player, location);
Notification.info(player, "已将你传送到 " + dominionDTO.getName()); Notification.info(player, Translation.Messages_TpToDominion, dominionDTO.getName());
return; return;
} }
if (!Dominion.config.getTpEnable()) { if (!Dominion.config.getTpEnable()) {
Notification.error(sender, "管理员没有开启领地传送功能"); Notification.error(sender, Translation.Messages_TpDisabled);
return; return;
} }
@ -412,19 +417,19 @@ public class DominionOperate {
if (!canByPass(player, dominionDTO, privilegeDTO)) { if (!canByPass(player, dominionDTO, privilegeDTO)) {
if (privilegeDTO == null) { if (privilegeDTO == null) {
if (!dominionDTO.getFlagValue(Flag.TELEPORT)) { if (!dominionDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "此领地禁止传送"); Notification.error(sender, Translation.Messages_DominionNoTp);
return; return;
} }
} else { } else {
GroupDTO groupDTO = Cache.instance.getGroup(privilegeDTO.getGroupId()); GroupDTO groupDTO = Cache.instance.getGroup(privilegeDTO.getGroupId());
if (privilegeDTO.getGroupId() != -1 && groupDTO != null) { if (privilegeDTO.getGroupId() != -1 && groupDTO != null) {
if (!groupDTO.getFlagValue(Flag.TELEPORT)) { if (!groupDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你所在的权限组组不被允许传送到这个领地"); Notification.error(sender, Translation.Messages_GroupNoTp);
return; return;
} }
} else { } else {
if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) { if (!privilegeDTO.getFlagValue(Flag.TELEPORT)) {
Notification.error(sender, "你不被允许传送到这个领地"); Notification.error(sender, Translation.Messages_PrivilegeNoTp);
return; return;
} }
} }
@ -436,19 +441,19 @@ public class DominionOperate {
if (next_time != null) { if (next_time != null) {
if (now.isBefore(next_time)) { if (now.isBefore(next_time)) {
long secs_until_next = now.until(next_time, java.time.temporal.ChronoUnit.SECONDS); long secs_until_next = now.until(next_time, java.time.temporal.ChronoUnit.SECONDS);
Notification.error(player, "请等待 %d 秒后再传送", secs_until_next); Notification.error(player, Translation.Messages_TpCoolDown, secs_until_next);
return; return;
} }
} }
if (Dominion.config.getTpDelay() > 0) { if (Dominion.config.getTpDelay() > 0) {
Notification.info(player, "传送将在 %d 秒后执行", Dominion.config.getTpDelay()); Notification.info(player, Translation.Messages_TpDelay, Dominion.config.getTpDelay());
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
int i = Dominion.config.getTpDelay(); int i = Dominion.config.getTpDelay();
while (i > 0) { while (i > 0) {
if (!player.isOnline()) { if (!player.isOnline()) {
return; return;
} }
Notification.actionBar(player, "传送倒计时 %d 秒", i); Notification.actionBar(player, Translation.Messages_TpCountDown, i);
i--; i--;
try { try {
Thread.sleep(1000); Thread.sleep(1000);
@ -465,22 +470,22 @@ public class DominionOperate {
int center_z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2; int center_z = (dominionDTO.getZ1() + dominionDTO.getZ2()) / 2;
World world = dominionDTO.getWorld(); World world = dominionDTO.getWorld();
if (world == null) { if (world == null) {
Notification.error(player, "领地所在世界不存在"); Notification.error(player, Translation.Messages_WorldNotExist);
return; return;
} }
if (location == null) { if (location == null) {
location = new Location(world, center_x, player.getLocation().getY(), center_z); location = new Location(world, center_x, player.getLocation().getY(), center_z);
Notification.warn(player, "领地 %s 没有设置传送点,将尝试传送到中心点", dominionDTO.getName()); Notification.warn(player, Translation.Messages_NoTpLocation, dominionDTO.getName());
} else if (!isInDominion(dominionDTO, location)) { } else if (!isInDominion(dominionDTO, location)) {
location = new Location(world, center_x, player.getLocation().getY(), center_z); location = new Location(world, center_x, player.getLocation().getY(), center_z);
Notification.warn(player, "领地 %s 传送点不在领地内,将尝试传送到中心点", dominionDTO.getName()); Notification.warn(player, Translation.Messages_TpLocationNotInside, dominionDTO.getName());
} }
if (player.isOnline()) { if (player.isOnline()) {
Teleport.doTeleportSafely(player, location).thenAccept(b -> { Teleport.doTeleportSafely(player, location).thenAccept(b -> {
if (b) { if (b) {
Notification.info(player, "已将你传送到 " + dominionDTO.getName()); Notification.info(player, Translation.Messages_TpToDominion, dominionDTO.getName());
} else { } else {
Notification.error(player, "传送失败,请重试"); Notification.error(player, Translation.Messages_TpFailed);
} }
}); });
} }
@ -498,7 +503,7 @@ public class DominionOperate {
return; return;
} }
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion set_map_color <颜色> [领地名称]"); Notification.error(sender, Translation.Commands_Dominion_SetMapColorUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -508,4 +513,5 @@ public class DominionOperate {
DominionController.setMapColor(operator, args[1], args[2]); DominionController.setMapColor(operator, args[1], args[2]);
} }
} }
} }

View File

@ -2,9 +2,10 @@ 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.tuis.dominion.manage.group.GroupList; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupSetting; import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupList;
import cn.lunadeer.dominion.tuis.dominion.manage.group.SelectMember; import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupSetting;
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;
@ -34,7 +35,7 @@ public class Group {
return; return;
} }
if (args.length < 4) { if (args.length < 4) {
Notification.error(sender, "用法: /dominion group create <领地名称> <权限组名称>"); Notification.error(sender, Translation.Commands_Group_CreateGroupUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -59,7 +60,7 @@ public class Group {
return; return;
} }
if (args.length < 4) { if (args.length < 4) {
Notification.error(sender, "用法: /dominion group delete <领地名称> <权限组名称>"); Notification.error(sender, Translation.Commands_Group_DeleteGroupUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -84,7 +85,7 @@ public class Group {
return; return;
} }
if (args.length < 5) { if (args.length < 5) {
Notification.error(sender, "用法: /dominion group rename <领地名称> <权限组旧名称> <新名称>"); Notification.error(sender, Translation.Commands_Group_RenameGroupUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -110,7 +111,7 @@ public class Group {
return; return;
} }
if (args.length < 6) { if (args.length < 6) {
Notification.error(sender, "用法: /dominion group set_flag <领地名称> <权限组名称> <权限名称> <true|false>"); Notification.error(sender, Translation.Commands_Group_SetGroupFlagUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -138,7 +139,7 @@ public class Group {
return; return;
} }
if (args.length < 5) { if (args.length < 5) {
Notification.error(sender, "用法: /dominion group add_member <领地名称> <权限组名称> <玩家名称>"); Notification.error(sender, Translation.Commands_Group_AddGroupMemberUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -165,7 +166,7 @@ public class Group {
return; return;
} }
if (args.length < 5) { if (args.length < 5) {
Notification.error(sender, "用法: /dominion group remove_member <领地名称> <权限组名称> <玩家名称>"); Notification.error(sender, Translation.Commands_Group_RemoveGroupMemberUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -182,7 +183,7 @@ public class Group {
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) { public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion group <create|delete|rename|set_flag|add_member|remove_member|select_member|setting|list>"); Notification.error(sender, Translation.Commands_Group_GroupUsage);
return; return;
} }
switch (args[1]) { switch (args[1]) {
@ -238,7 +239,7 @@ public class Group {
if (args.length == 4) { if (args.length == 4) {
switch (args[1]) { switch (args[1]) {
case "create": case "create":
return Collections.singletonList("新权限组名称"); return Collections.singletonList(Translation.Commands_Group_NewGroupName.trans());
case "delete": case "delete":
case "rename": case "rename":
case "set_flag": case "set_flag":
@ -252,7 +253,7 @@ public class Group {
if (args.length == 5) { if (args.length == 5) {
switch (args[1]) { switch (args[1]) {
case "rename": case "rename":
return Collections.singletonList("权限组新名称"); return Collections.singletonList(Translation.Commands_Group_NewGroupName.trans());
case "set_flag": case "set_flag":
return playerPrivileges(); return playerPrivileges();
case "remove_member": case "remove_member":

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

@ -2,10 +2,11 @@ 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.tuis.dominion.manage.member.MemberList; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberSetting; 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.MemberSetting;
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectTemplate; import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.SelectPlayer;
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;
@ -35,7 +36,7 @@ public class Member {
return; return;
} }
if (args.length < 4) { if (args.length < 4) {
Notification.error(sender, "用法: /dominion member add <领地名称> <玩家名称>"); Notification.error(sender, Translation.Commands_Member_DominionAddMemberUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -61,7 +62,7 @@ public class Member {
return; return;
} }
if (args.length < 6) { if (args.length < 6) {
Notification.error(sender, "用法: /dominion member set_flag <领地名称> <玩家名称> <权限名称> <true/false>"); Notification.error(sender, Translation.Commands_Member_DominionSetFlagUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -90,7 +91,7 @@ public class Member {
return; return;
} }
if (args.length < 4) { if (args.length < 4) {
Notification.error(sender, "用法: /dominion member remove <领地名称> <玩家名称>"); Notification.error(sender, Translation.Commands_Member_DominionRemoveMemberUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -116,7 +117,7 @@ public class Member {
return; return;
} }
if (args.length < 5) { if (args.length < 5) {
Notification.error(sender, "用法: /dominion member apply_template <领地名称> <玩家名称> <模板名称>"); Notification.error(sender, Translation.Commands_Member_DominionApplyTemplateUsage);
return; return;
} }
BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender); BukkitPlayerOperator operator = BukkitPlayerOperator.create(sender);
@ -132,7 +133,7 @@ public class Member {
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) { public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion member <add/set_flag/remove/apply_template/list/setting/select_player/select_template>"); Notification.error(sender, Translation.Commands_Member_MemberUsage);
return; return;
} }
switch (args[1]) { switch (args[1]) {
@ -191,7 +192,7 @@ public class Member {
case "select_player": case "select_player":
return playerNames(); return playerNames();
case "list": case "list":
return Collections.singletonList("页码(可选)"); return Collections.singletonList(Translation.Commands_PageOptional.trans());
} }
} }
if (args.length == 5) { if (args.length == 5) {
@ -202,7 +203,7 @@ public class Member {
return allTemplates(sender); return allTemplates(sender);
case "setting": case "setting":
case "select_template": case "select_template":
return Collections.singletonList("页码(可选)"); return Collections.singletonList(Translation.Commands_PageOptional.trans());
} }
} }
if (args.length == 6) { if (args.length == 6) {

View File

@ -5,7 +5,8 @@ import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.DominionController; import cn.lunadeer.dominion.controllers.DominionController;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.tuis.MigrateList; import cn.lunadeer.dominion.managers.Translation;
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;
@ -28,27 +29,27 @@ public class Migration {
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;
} }
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion migrate <res领地名称>"); Notification.error(sender, Translation.Commands_Residence_MigrateUsage);
return; return;
} }
String resName = args[1]; String resName = args[1];
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) {
Notification.error(sender, "你没有可迁移的数据"); Notification.error(sender, Translation.Commands_Residence_NoMigrationData);
return; return;
} }
ResMigration.ResidenceNode resNode = res_data.stream().filter(node -> node.name.equals(resName)).findFirst().orElse(null); ResMigration.ResidenceNode resNode = res_data.stream().filter(node -> node.name.equals(resName)).findFirst().orElse(null);
if (resNode == null) { if (resNode == null) {
Notification.error(sender, "未找到指定的 Residence 领地"); Notification.error(sender, Translation.Commands_Residence_NoResidenceDominion);
return; return;
} }
if (!resNode.owner.equals(player.getUniqueId())) { if (!resNode.owner.equals(player.getUniqueId())) {
Notification.error(sender, "你不是该领地的所有者,无法迁移此领地"); Notification.error(sender, Translation.Commands_Residence_ResidenceNotOwner);
return; return;
} }
create(player, resNode, ""); create(player, resNode, "");
@ -60,7 +61,7 @@ public class Migration {
MigrateList.show(sender, newArgs); MigrateList.show(sender, newArgs);
} }
} catch (Exception e) { } catch (Exception e) {
Notification.error(sender, "迁移失败: " + e.getMessage()); Notification.error(sender, Translation.Commands_Residence_MigrateFailed, e.getMessage());
} }
} }
@ -78,7 +79,7 @@ public class Migration {
for (String msg : result.getMessages()) { for (String msg : result.getMessages()) {
Notification.info(player, msg); Notification.info(player, msg);
} }
Notification.info(player, "领地 " + node.name + " 已从 Residence 迁移至 Dominion"); Notification.info(player, Translation.Commands_Residence_MigrateSuccess, node.name);
if (node.children != null) { if (node.children != null) {
for (ResMigration.ResidenceNode child : node.children) { for (ResMigration.ResidenceNode child : node.children) {
create(player, child, node.name); create(player, child, node.name);

View File

@ -2,8 +2,10 @@ 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.utils.MapRender; import cn.lunadeer.dominion.managers.DatabaseTables;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.map.MapRender;
import cn.lunadeer.minecraftpluginutils.GiteaReleaseCheck; import cn.lunadeer.minecraftpluginutils.GiteaReleaseCheck;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
@ -28,19 +30,19 @@ public class Operator {
return; return;
} }
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在从数据库重新加载领地缓存..."); Notification.info(sender, Translation.Commands_Operator_ReloadingDominionCache);
Cache.instance.loadDominions(); Cache.instance.loadDominions();
Notification.info(sender, "领地缓存已重新加载"); Notification.info(sender, Translation.Commands_Operator_ReloadedDominionCache);
}); });
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在从数据库重新加载玩家权限缓存..."); Notification.info(sender, Translation.Commands_Operator_ReloadingPrivilegeCache);
Cache.instance.loadMembers(); Cache.instance.loadMembers();
Notification.info(sender, "玩家权限缓存已重新加载"); Notification.info(sender, Translation.Commands_Operator_ReloadedPrivilegeCache);
}); });
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在从数据库重新加载权限组缓存..."); Notification.info(sender, Translation.Commands_Operator_ReloadingGroupCache);
Cache.instance.loadGroups(); Cache.instance.loadGroups();
Notification.info(sender, "权限组缓存已重新加载"); Notification.info(sender, Translation.Commands_Operator_ReloadedGroupCache);
}); });
} }
@ -49,9 +51,9 @@ public class Operator {
return; return;
} }
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在导出拥有领地的MCA文件列表..."); 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;
@ -81,42 +83,42 @@ public class Operator {
if (!folder.exists()) { if (!folder.exists()) {
boolean success = folder.mkdirs(); boolean success = folder.mkdirs();
if (!success) { if (!success) {
Notification.error(sender, "创建导出文件夹失败"); Notification.error(sender, Translation.Commands_Operator_CreateExportFolderFailed);
return; return;
} }
} }
for (String world : mca_cords.keySet()) { for (String world : mca_cords.keySet()) {
File file = new File(folder, world + ".txt"); File file = new File(folder, world + ".txt");
Notification.info(sender, "正在导出 %s 的MCA文件列表...", world); Notification.info(sender, Translation.Commands_Operator_ExportingMCAListForWorld, world);
try { try {
if (file.exists()) { if (file.exists()) {
boolean success = file.delete(); boolean success = file.delete();
if (!success) { if (!success) {
Notification.error(sender, "删除 %s 的MCA文件列表失败", world); Notification.error(sender, Translation.Commands_Operator_DeleteMCAListFailed, world);
continue; continue;
} }
} }
boolean success = file.createNewFile(); boolean success = file.createNewFile();
if (!success) { if (!success) {
Notification.error(sender, "创建 %s 的MCA文件列表失败", world); Notification.error(sender, Translation.Commands_Operator_CreateMCAListFailed, world);
continue; continue;
} }
List<String> cords = mca_cords.get(world); List<String> cords = mca_cords.get(world);
for (String cord : cords) { for (String cord : cords) {
XLogger.debug("正在写入 %s...", cord); XLogger.debug("Writing %s...", cord);
try { try {
java.nio.file.Files.write(file.toPath(), (cord + "\n").getBytes(), java.nio.file.StandardOpenOption.APPEND); java.nio.file.Files.write(file.toPath(), (cord + "\n").getBytes(), java.nio.file.StandardOpenOption.APPEND);
} catch (Exception e) { } catch (Exception e) {
Notification.error(sender, "写入 %s 失败", cord); Notification.error(sender, Translation.Commands_Operator_WriteMCAListFailed, cord);
} }
} }
} catch (Exception e) { } catch (Exception e) {
Notification.error(sender, "导出 %s 的MCA文件列表失败", world); Notification.error(sender, Translation.Commands_Operator_ExportMCAListFailed, world);
Notification.error(sender, e.getMessage()); Notification.error(sender, e.getMessage());
} }
} }
MapRender.renderMCA(mca_cords); MapRender.renderMCA(mca_cords);
Notification.info(sender, "MCA文件列表已导出到 %s", folder.getAbsolutePath()); Notification.info(sender, Translation.Commands_Operator_ExportedMCAList, folder.getAbsolutePath());
}); });
} }
@ -125,7 +127,7 @@ public class Operator {
return; return;
} }
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
Notification.info(sender, "正在重新加载配置文件..."); Notification.info(sender, Translation.Commands_Operator_ReloadingConfig);
Dominion.config.reload(); Dominion.config.reload();
DatabaseManager.instance.reConnection( DatabaseManager.instance.reConnection(
DatabaseType.valueOf(Dominion.config.getDbType().toUpperCase()), DatabaseType.valueOf(Dominion.config.getDbType().toUpperCase()),
@ -135,10 +137,46 @@ public class Operator {
Dominion.config.getDbUser(), Dominion.config.getDbUser(),
Dominion.config.getDbPass() Dominion.config.getDbPass()
); );
Notification.info(sender, "配置文件已重新加载"); Notification.info(sender, Translation.Commands_Operator_ReloadedConfig);
}); });
} }
/**
* 导出数据库
* /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,279 +0,0 @@
package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.Dominion;
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, "参数错误");
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, "未知参数");
}
}
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 < 2) {
Dominion.config.setAutoCreateRadius(2);
Notification.error(sender, "自动创建半径不能小于2");
} 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, "最高Y坐标限制不能小于最低Y坐标限制");
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, "最低Y坐标限制不能大于最高Y坐标限制");
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, "X轴(东西)最大尺寸不能小于4");
} 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, "Z轴(南北)最大尺寸不能小于4");
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, "Y轴(垂直)最大尺寸不能小于4");
} 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, "每个玩家领地数量限制不能小于0");
} 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, "领地深度限制不能小于0");
} 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, "传送延迟不能小于0");
} 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, "传送冷却时间不能小于0");
} 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, "每方块单价不能小于0");
} 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, "领地退款比例不能小于0");
} 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, "出生点保护半径不能小于或等于0");
} else {
Dominion.config.setSpawnProtection(spawnProtection);
}
refreshPageOrNot(sender, args);
}
}

View File

@ -2,8 +2,9 @@ package cn.lunadeer.dominion.commands;
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator; import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
import cn.lunadeer.dominion.controllers.TemplateController; import cn.lunadeer.dominion.controllers.TemplateController;
import cn.lunadeer.dominion.tuis.template.TemplateList; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.template.TemplateSetting; import cn.lunadeer.dominion.uis.tuis.template.TemplateList;
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;
@ -36,7 +37,7 @@ public class Template {
return; return;
} }
if (args.length < 3) { if (args.length < 3) {
Notification.error(sender, "用法: /dominion template create <模板名称>"); Notification.error(sender, Translation.Commands_Template_CreateTemplateUsage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
@ -62,7 +63,7 @@ public class Template {
return; return;
} }
if (args.length < 3) { if (args.length < 3) {
Notification.error(sender, "用法: /dominion template delete <模板名称>"); Notification.error(sender, Translation.Commands_Template_DeleteTemplateUsage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
@ -88,7 +89,7 @@ public class Template {
return; return;
} }
if (args.length < 5) { if (args.length < 5) {
Notification.error(sender, "用法: /dominion template set_flag <模板名称> <权限名称> <true/false>"); Notification.error(sender, Translation.Commands_Template_SetTemplateFlagUsage);
return; return;
} }
Player player = playerOnly(sender); Player player = playerOnly(sender);
@ -107,7 +108,7 @@ public class Template {
public static void handle(@NotNull CommandSender sender, @NotNull String[] args) { public static void handle(@NotNull CommandSender sender, @NotNull String[] args) {
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion template <list|setting|delete|create|set_flag>"); Notification.error(sender, Translation.Commands_Template_TemplateUsage);
return; return;
} }
switch (args[1]) { switch (args[1]) {
@ -136,13 +137,13 @@ public class Template {
if (args.length == 3) { if (args.length == 3) {
switch (args[1]) { switch (args[1]) {
case "create": case "create":
return Collections.singletonList("输入模板名称"); return Collections.singletonList(Translation.Commands_Template_NewTemplateName.trans());
case "delete": case "delete":
case "set_flag": case "set_flag":
case "setting": case "setting":
return allTemplates(sender); return allTemplates(sender);
case "list": case "list":
return Collections.singletonList("页码(可选)"); return Collections.singletonList(Translation.Commands_PageOptional.trans());
} }
} }
if (args.length == 4) { if (args.length == 4) {
@ -150,7 +151,7 @@ public class Template {
case "set_flag": case "set_flag":
return playerPrivileges(); return playerPrivileges();
case "setting": case "setting":
return Collections.singletonList("页码(可选)"); return Collections.singletonList(Translation.Commands_PageOptional.trans());
} }
} }
if (args.length == 5) { if (args.length == 5) {

View File

@ -5,7 +5,8 @@ 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.tuis.TitleList; import cn.lunadeer.dominion.managers.Translation;
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;
@ -25,7 +26,7 @@ public class Title {
Player bukkit_player = playerOnly(sender); Player bukkit_player = playerOnly(sender);
if (bukkit_player == null) return; if (bukkit_player == null) return;
if (args.length < 2) { if (args.length < 2) {
Notification.error(sender, "用法: /dominion use_title <权限组ID>"); Notification.error(sender, Translation.Commands_Title_UseTitleUsage);
return; return;
} }
try { try {
@ -33,36 +34,36 @@ public class Title {
PlayerDTO player = PlayerDTO.get(bukkit_player); PlayerDTO player = PlayerDTO.get(bukkit_player);
if (id == -1) { if (id == -1) {
player.setUsingGroupTitleID(id); player.setUsingGroupTitleID(id);
Notification.info(sender, "成功卸下权限组称号"); Notification.info(sender, Translation.Commands_Title_RemoveTitleSuccess);
} else { } else {
GroupDTO group = Cache.instance.getGroup(id); GroupDTO group = Cache.instance.getGroup(id);
if (group == null) { if (group == null) {
Notification.error(sender, "权限组不存在"); Notification.error(sender, Translation.Commands_Title_GroupNotExist);
return; return;
} }
DominionDTO dominion = Cache.instance.getDominion(group.getDomID()); DominionDTO dominion = Cache.instance.getDominion(group.getDomID());
if (dominion == null) { if (dominion == null) {
Notification.error(sender, "权限组 %s 所属领地不存在", 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())) {
MemberDTO member = Cache.instance.getMember(bukkit_player, dominion); MemberDTO member = Cache.instance.getMember(bukkit_player, dominion);
if (member == null) { if (member == null) {
Notification.error(sender, "你不是 %s 的成员,无法使用其称号", dominion.getName()); Notification.error(sender, Translation.Commands_Title_NotDominionMember, dominion.getName());
return; return;
} }
if (!Objects.equals(member.getGroupId(), group.getId())) { if (!Objects.equals(member.getGroupId(), group.getId())) {
Notification.error(sender, "你不属于权限组 %s无法使用其称号", group.getName()); Notification.error(sender, Translation.Commands_Title_NotGroupMember, group.getNamePlain());
return; return;
} }
} }
player.setUsingGroupTitleID(group.getId()); player.setUsingGroupTitleID(group.getId());
Notification.info(sender, "成功使用权限组 %s 称号", 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);
} catch (Exception e) { } catch (Exception e) {
Notification.error(sender, "使用称号失败: " + e.getMessage()); Notification.error(sender, Translation.Commands_Title_UseTitleFailed, e.getMessage());
} }
} }

View File

@ -1,5 +1,6 @@
package cn.lunadeer.dominion.controllers; package cn.lunadeer.dominion.controllers;
import cn.lunadeer.minecraftpluginutils.i18n.i18n;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -20,6 +21,12 @@ public interface AbstractOperator {
private Integer success; private Integer success;
private List<String> messages; private List<String> messages;
public Result(Integer success, i18n message, Object... args) {
this.success = success;
this.messages = new ArrayList<>();
this.messages.add(String.format(message.trans(), args));
}
public Result(Integer success, String message, Object... args) { public Result(Integer success, String message, Object... args) {
this.success = success; this.success = success;
this.messages = new ArrayList<>(); this.messages = new ArrayList<>();
@ -31,6 +38,10 @@ public interface AbstractOperator {
return this; return this;
} }
public Result addMessage(i18n message, Object... args) {
return addMessage(message.trans(), args);
}
public Integer getStatus() { public Integer getStatus() {
return success; return success;
} }

View File

@ -4,6 +4,7 @@ import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.dtos.DominionDTO; import cn.lunadeer.dominion.dtos.DominionDTO;
import cn.lunadeer.dominion.dtos.PlayerDTO; import cn.lunadeer.dominion.dtos.PlayerDTO;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.utils.Particle; import cn.lunadeer.dominion.utils.Particle;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import cn.lunadeer.minecraftpluginutils.VaultConnect.VaultConnect; import cn.lunadeer.minecraftpluginutils.VaultConnect.VaultConnect;
@ -84,32 +85,40 @@ public class DominionController {
public static void create(AbstractOperator operator, String name, public static void create(AbstractOperator operator, String name,
Location loc1, Location loc2, Location loc1, Location loc2,
@NotNull String parent_dominion_name, boolean skipEco) { @NotNull String parent_dominion_name, boolean skipEco) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_CreateDominionFailed);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功创建领地 %s", name); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_CreateDominionSuccess, name);
if (name.isEmpty()) { if (name.isEmpty()) {
operator.setResponse(FAIL.addMessage("领地名称不能为空")); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNameShouldNotEmpty));
return; return;
} }
if (name.contains(" ") || name.contains(".")) { if (name.contains(" ") || name.contains(".")) {
operator.setResponse(FAIL.addMessage("领地名称不能包含空格或点")); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNameInvalid));
return; return;
} }
if (DominionDTO.select(name) != null) { if (DominionDTO.select(name) != null) {
operator.setResponse(FAIL.addMessage("已经存在名称为 %s 的领地", name)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNameExist, name));
return; return;
} }
if (!loc1.getWorld().getUID().equals(loc2.getWorld().getUID())) { if (!loc1.getWorld().getUID().equals(loc2.getWorld().getUID())) {
operator.setResponse(FAIL.addMessage("选点世界不一致")); operator.setResponse(FAIL.addMessage(Translation.Messages_SelectPointsWorldNotSame));
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; return;
} }
// 检查世界是否可以创建 // 检查世界是否可以创建
if (worldNotValid(operator, loc1.getWorld().getName())) { if (worldNotValid(operator, loc1.getWorld().getName())) {
operator.setResponse(FAIL.addMessage("禁止在世界 %s 创建领地", loc1.getWorld().getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_CreateDominionDisabledWorld, loc1.getWorld().getName()));
return; return;
} }
// 检查领地数量是否达到上限 // 检查领地数量是否达到上限
if (amountNotValid(operator)) { if (amountNotValid(operator)) {
operator.setResponse(FAIL.addMessage("你的领地数量已达上限(%d个)", Dominion.config.getLimitAmount(operator.getPlayer()))); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionAmountLimit, Dominion.config.getLimitAmount(operator.getPlayer())));
return; return;
} }
int minX = Math.min(loc1.getBlockX(), loc2.getBlockX()); int minX = Math.min(loc1.getBlockX(), loc2.getBlockX());
@ -129,16 +138,16 @@ public class DominionController {
parent_dominion = DominionDTO.select(parent_dominion_name); parent_dominion = DominionDTO.select(parent_dominion_name);
} }
if (parent_dominion == null) { if (parent_dominion == null) {
operator.setResponse(FAIL.addMessage("父领地 %s 不存在", parent_dominion_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_ParentDominionNotExist, parent_dominion_name));
if (parent_dominion_name.isEmpty()) { if (parent_dominion_name.isEmpty()) {
XLogger.err("根领地丢失!"); XLogger.err(Translation.Messages_RootDominionLost);
} }
return; return;
} }
// 是否是父领地的拥有者 // 是否是父领地的拥有者
if (parent_dominion.getId() != -1) { if (parent_dominion.getId() != -1) {
if (notOwner(operator, parent_dominion)) { if (notOwner(operator, parent_dominion)) {
operator.setResponse(FAIL.addMessage("你不是父领地 %s 的拥有者,无法创建子领地", parent_dominion_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotParentDominionOwner, parent_dominion_name));
return; return;
} }
} }
@ -147,7 +156,7 @@ public class DominionController {
minX, minY, minZ, maxX, maxY, maxZ, parent_dominion); minX, minY, minZ, maxX, maxY, maxZ, parent_dominion);
// 如果parent_dominion不为-1 检查是否在同一世界 // 如果parent_dominion不为-1 检查是否在同一世界
if (parent_dominion.getId() != -1 && !parent_dominion.getWorldUid().equals(dominion.getWorldUid())) { if (parent_dominion.getId() != -1 && !parent_dominion.getWorldUid().equals(dominion.getWorldUid())) {
operator.setResponse(FAIL.addMessage("父领地与子领地不在同一世界。")); operator.setResponse(FAIL.addMessage(Translation.Messages_ParentDominionNotInSameWorld));
return; return;
} }
// 检查深度是否达到上限 // 检查深度是否达到上限
@ -156,20 +165,20 @@ public class DominionController {
} }
// 检查是否超出父领地范围 // 检查是否超出父领地范围
if (!isContained(dominion, parent_dominion)) { if (!isContained(dominion, parent_dominion)) {
operator.setResponse(FAIL.addMessage("超出父领地 %s 范围", parent_dominion.getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_OutOfParentDominionRange, parent_dominion.getName()));
return; return;
} }
// 获取此领地的所有同级领地 // 获取此领地的所有同级领地
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorldUid(), parent_dominion.getId()); List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorldUid(), parent_dominion.getId());
// 检查是否与出生点保护冲突 // 检查是否与出生点保护冲突
if (isIntersectSpawn(operator, dominion)) { if (isIntersectSpawn(operator, dominion)) {
operator.setResponse(FAIL.addMessage("与出生点保护冲突")); operator.setResponse(FAIL.addMessage(Translation.Messages_ConflictWithSpawnProtect));
return; return;
} }
// 检查是否与其他子领地冲突 // 检查是否与其他子领地冲突
for (DominionDTO sub_dominion : sub_dominions) { for (DominionDTO sub_dominion : sub_dominions) {
if (isIntersect(sub_dominion, dominion)) { if (isIntersect(sub_dominion, dominion)) {
operator.setResponse(FAIL.addMessage("与领地 %s 冲突", sub_dominion.getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_ConflictWithDominion, sub_dominion.getName()));
return; return;
} }
} }
@ -181,7 +190,7 @@ public class DominionController {
} }
dominion = DominionDTO.insert(dominion); dominion = DominionDTO.insert(dominion);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("创建领地失败,数据库错误,请联系管理员")); operator.setResponse(FAIL.addMessage(Translation.Messages_DatabaseError));
return; return;
} }
// 显示粒子效果 // 显示粒子效果
@ -230,7 +239,7 @@ public class DominionController {
public static void expand(AbstractOperator operator, Integer size) { public static void expand(AbstractOperator operator, Integer size) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "无法获取你所处的领地,请指定名称")); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_CannotGetDominionAuto));
return; return;
} }
expand(operator, size, dominion.getName()); expand(operator, size, dominion.getName());
@ -244,7 +253,7 @@ public class DominionController {
* @param dominion_name 领地名称 * @param dominion_name 领地名称
*/ */
public static void expand(AbstractOperator operator, Integer size, String dominion_name) { public static void expand(AbstractOperator operator, Integer size, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "扩展领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_ExpandDominionFailed);
DominionDTO dominion = expandContractPreCheck(operator, getExistDomAndIsOwner(operator, dominion_name), FAIL); DominionDTO dominion = expandContractPreCheck(operator, getExistDomAndIsOwner(operator, dominion_name), FAIL);
if (dominion == null) { if (dominion == null) {
return; return;
@ -254,18 +263,23 @@ public class DominionController {
return; return;
} }
// 检查是否与出生点保护冲突 // 检查是否与出生点保护冲突
if (isIntersectSpawn(operator, dominion.getWorld(), newCords)) { World world = Dominion.instance.getServer().getWorld(dominion.getWorldUid());
operator.setResponse(FAIL.addMessage("与出生点保护冲突")); if (world == null) {
operator.setResponse(FAIL.addMessage(Translation.Messages_DominionWorldLost));
return;
}
if (isIntersectSpawn(operator, world, newCords)) {
operator.setResponse(FAIL.addMessage(Translation.Messages_ConflictWithSpawnProtect));
return; return;
} }
// 校验是否超出父领地范围 // 校验是否超出父领地范围
DominionDTO parent_dominion = DominionDTO.select(dominion.getParentDomId()); DominionDTO parent_dominion = DominionDTO.select(dominion.getParentDomId());
if (parent_dominion == null) { if (parent_dominion == null) {
operator.setResponse(FAIL.addMessage("父领地丢失")); operator.setResponse(FAIL.addMessage(Translation.Messages_ParentDominionLost));
return; return;
} }
if (!isContained(newCords, parent_dominion)) { if (!isContained(newCords, parent_dominion)) {
operator.setResponse(FAIL.addMessage("超出父领地 %s 范围", parent_dominion.getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_OutOfParentDominionRange, parent_dominion.getName()));
return; return;
} }
// 获取同世界下的所有同级领地 // 获取同世界下的所有同级领地
@ -274,11 +288,11 @@ public class DominionController {
if (isIntersect(exist_dominion, newCords)) { if (isIntersect(exist_dominion, newCords)) {
// 如果是自己跳过 // 如果是自己跳过
if (exist_dominion.getId().equals(dominion.getId())) continue; if (exist_dominion.getId().equals(dominion.getId())) continue;
operator.setResponse(FAIL.addMessage("与领地 %s 冲突", exist_dominion.getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_ConflictWithDominion, exist_dominion.getName()));
return; return;
} }
} }
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功扩展领地 %s %d格", dominion_name, size); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_ExpandDominionSuccess, dominion_name, size);
// 检查经济 // 检查经济
if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ(operator.getPlayer()) ? sqr(newCords) - dominion.getSquare() : vol(newCords) - dominion.getVolume() if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ(operator.getPlayer()) ? sqr(newCords) - dominion.getSquare() : vol(newCords) - dominion.getVolume()
, true, FAIL, SUCCESS)) return; , true, FAIL, SUCCESS)) return;
@ -299,7 +313,7 @@ public class DominionController {
public static void contract(AbstractOperator operator, Integer size) { public static void contract(AbstractOperator operator, Integer size) {
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "无法获取你所处的领地,请指定名称")); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_CannotGetDominionAuto));
return; return;
} }
contract(operator, size, dominion.getName()); contract(operator, size, dominion.getName());
@ -313,7 +327,7 @@ public class DominionController {
* @param dominion_name 领地名称 * @param dominion_name 领地名称
*/ */
public static void contract(AbstractOperator operator, Integer size, String dominion_name) { public static void contract(AbstractOperator operator, Integer size, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "缩小领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_ContractDominionFailed);
DominionDTO dominion = expandContractPreCheck(operator, getExistDomAndIsOwner(operator, dominion_name), FAIL); DominionDTO dominion = expandContractPreCheck(operator, getExistDomAndIsOwner(operator, dominion_name), FAIL);
if (dominion == null) { if (dominion == null) {
return; return;
@ -326,11 +340,11 @@ public class DominionController {
List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorldUid(), dominion.getId()); List<DominionDTO> sub_dominions = DominionDTO.selectByParentId(dominion.getWorldUid(), dominion.getId());
for (DominionDTO sub_dominion : sub_dominions) { for (DominionDTO sub_dominion : sub_dominions) {
if (!isContained(sub_dominion, newCords)) { if (!isContained(sub_dominion, newCords)) {
operator.setResponse(FAIL.addMessage("缩小后的领地无法包含子领地 %s", sub_dominion.getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_ContractDominionConflict, sub_dominion.getName()));
return; return;
} }
} }
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功缩小领地 %s %d格", dominion_name, size); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_ContractDominionSuccess, dominion_name, size);
// 退还经济 // 退还经济
if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ(operator.getPlayer()) ? dominion.getSquare() - sqr(newCords) : dominion.getVolume() - vol(newCords) if (handleEconomyFailed(operator, Dominion.config.getEconomyOnlyXZ(operator.getPlayer()) ? dominion.getSquare() - sqr(newCords) : dominion.getVolume() - vol(newCords)
, false, FAIL, SUCCESS)) return; , false, FAIL, SUCCESS)) return;
@ -364,18 +378,18 @@ public class DominionController {
* @param force 是否强制删除 * @param force 是否强制删除
*/ */
public static void delete(AbstractOperator operator, String dominion_name, boolean force) { public static void delete(AbstractOperator operator, String dominion_name, boolean force) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "删除领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_DeleteDominionFailed);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "领地 %s 及其所有子领地已删除", dominion_name); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_DeleteDominionSuccess, dominion_name);
DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name);
if (dominion == null) { if (dominion == null) {
return; return;
} }
List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion); List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion);
if (!force) { if (!force) {
AbstractOperator.Result WARNING = new AbstractOperator.Result(AbstractOperator.Result.WARNING, "删除领地 %s 会同时删除其所有子领地,是否继续?", dominion_name); AbstractOperator.Result WARNING = new AbstractOperator.Result(AbstractOperator.Result.WARNING, Translation.Messages_DeleteDominionConfirm, dominion_name);
showSubNamesWarning(sub_dominions, WARNING); showSubNamesWarning(sub_dominions, WARNING);
if (operator instanceof BukkitPlayerOperator) { if (operator instanceof BukkitPlayerOperator) {
Notification.warn(operator.getPlayer(), "输入 /dominion delete %s force 确认删除", dominion_name); Notification.warn(operator.getPlayer(), Translation.Messages_DeleteDominionForceConfirm, dominion_name);
} }
operator.setResponse(WARNING); operator.setResponse(WARNING);
return; return;
@ -425,7 +439,7 @@ public class DominionController {
return; return;
} }
dominion.setJoinMessage(message); dominion.setJoinMessage(message);
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功设置领地 %s 的进入消息", dominion_name)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_SetEnterMessageSuccess, dominion_name));
} }
/** /**
@ -455,7 +469,7 @@ public class DominionController {
return; return;
} }
dominion.setLeaveMessage(message); dominion.setLeaveMessage(message);
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功设置领地 %s 的离开消息", dominion_name)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_SetLeaveMessageSuccess, dominion_name));
} }
/** /**
@ -478,15 +492,15 @@ public class DominionController {
* @param dominion_name 领地名称 * @param dominion_name 领地名称
*/ */
public static void setTpLocation(AbstractOperator operator, int x, int y, int z, String dominion_name) { public static void setTpLocation(AbstractOperator operator, int x, int y, int z, String dominion_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置领地传送点失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_SetTpLocationFailed);
DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dominion_name);
if (dominion == null) { if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地 %s 不存在", dominion_name)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_DominionNotExist, dominion_name));
return; return;
} }
World world = dominion.getWorld(); World world = dominion.getWorld();
if (world == null) { if (world == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地所在世界不存在")); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_DominionWorldNotExist));
return; return;
} }
Location loc = new Location(world, x, y, z); Location loc = new Location(world, x, y, z);
@ -495,10 +509,10 @@ public class DominionController {
loc.setY(loc.getY() + 1.5); loc.setY(loc.getY() + 1.5);
dominion.setTpLocation(loc); dominion.setTpLocation(loc);
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS,
"成功设置领地 %s 的传送点 %d %d %d", dominion_name Translation.Messages_SetTpLocationSuccess, dominion_name
, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); , loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
} else { } else {
operator.setResponse(FAIL.addMessage("传送点不在领地 %s 内", dominion_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_TpLocationNotInDominion, dominion_name));
} }
} }
@ -510,17 +524,17 @@ public class DominionController {
* @param new_name 新名称 * @param new_name 新名称
*/ */
public static void rename(AbstractOperator operator, String old_name, String new_name) { public static void rename(AbstractOperator operator, String old_name, String new_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "重命名领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_RenameDominionFailed);
if (new_name.isEmpty()) { if (new_name.isEmpty()) {
operator.setResponse(FAIL.addMessage("新名称不能为空")); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNameShouldNotEmpty));
return; return;
} }
if (new_name.contains(" ") || new_name.contains(".")) { if (new_name.contains(" ") || new_name.contains(".")) {
operator.setResponse(FAIL.addMessage("领地名称不能包含空格或点")); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNameInvalid));
return; return;
} }
if (Objects.equals(old_name, new_name)) { if (Objects.equals(old_name, new_name)) {
operator.setResponse(FAIL.addMessage("新名称与旧名称相同")); operator.setResponse(FAIL.addMessage(Translation.Messages_RenameDominionSameName));
return; return;
} }
DominionDTO dominion = getExistDomAndIsOwner(operator, old_name); DominionDTO dominion = getExistDomAndIsOwner(operator, old_name);
@ -528,11 +542,11 @@ public class DominionController {
return; return;
} }
if (DominionDTO.select(new_name) != null) { if (DominionDTO.select(new_name) != null) {
operator.setResponse(FAIL.addMessage("已经存在名称为 %s 的领地", new_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNameExist, new_name));
return; return;
} }
dominion.setName(new_name); dominion.setName(new_name);
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功将领地 %s 重命名为 %s", old_name, new_name)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_RenameDominionSuccess, old_name, new_name));
} }
/** /**
@ -544,35 +558,30 @@ public class DominionController {
* @param force 是否强制转让 * @param force 是否强制转让
*/ */
public static void give(AbstractOperator operator, String dom_name, String player_name, boolean force) { public static void give(AbstractOperator operator, String dom_name, String player_name, boolean force) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "转让领地失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_GiveDominionFailed);
PlayerDTO operatorDTO = PlayerDTO.select(operator.getUniqueId());
if (operatorDTO == null) {
operator.setResponse(FAIL.addMessage("操作者信息丢失,请联系管理员"));
return;
}
DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name);
if (dominion == null) { if (dominion == null) {
return; return;
} }
PlayerDTO player = PlayerController.getPlayerDTO(player_name); PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) { if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在", player_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotExist, player_name));
return; return;
} }
if (Objects.equals(dominion.getOwner(), player.getUuid())) { if (Objects.equals(dominion.getOwner(), player.getUuid())) {
operator.setResponse(FAIL.addMessage("领地 %s 已经属于 %s无需转移", dom_name, player_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionAlreadyBelong, dom_name, player_name));
return; return;
} }
if (dominion.getParentDomId() != -1) { if (dominion.getParentDomId() != -1) {
operator.setResponse(FAIL.addMessage("子领地无法转让,你可以通过将 %s 设置为管理员来让其管理领地 %s ", player_name, dom_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_SubDominionCannotGive, player_name, dom_name));
return; return;
} }
List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion); List<DominionDTO> sub_dominions = getSubDominionsRecursive(dominion);
if (!force) { if (!force) {
AbstractOperator.Result WARNING = new AbstractOperator.Result(AbstractOperator.Result.WARNING, "转让领地 %s 给 %s 会同时转让其所有子领地,是否继续?", dom_name, player_name); AbstractOperator.Result WARNING = new AbstractOperator.Result(AbstractOperator.Result.WARNING, Translation.Messages_GiveDominionConfirm, dom_name, player_name);
showSubNamesWarning(sub_dominions, WARNING); showSubNamesWarning(sub_dominions, WARNING);
if (operator instanceof BukkitPlayerOperator) { if (operator instanceof BukkitPlayerOperator) {
Notification.warn(operator.getPlayer(), "输入 /dominion give %s %s force 确认转让", dom_name, player_name); Notification.warn(operator.getPlayer(), Translation.Messages_GiveDominionForceConfirm, dom_name, player_name);
} }
operator.setResponse(WARNING); operator.setResponse(WARNING);
return; return;
@ -581,7 +590,7 @@ public class DominionController {
for (DominionDTO sub_dominion : sub_dominions) { for (DominionDTO sub_dominion : sub_dominions) {
sub_dominion.setOwner(player.getUuid()); sub_dominion.setOwner(player.getUuid());
} }
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功将领地 %s 及其所有子领地转让给 %s", dom_name, player_name)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_GiveDominionSuccess, dom_name, player_name));
} }
/** /**
@ -592,22 +601,18 @@ public class DominionController {
* @param dom_name 领地名称 * @param dom_name 领地名称
*/ */
public static void setMapColor(AbstractOperator operator, String color, String dom_name) { public static void setMapColor(AbstractOperator operator, String color, String dom_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置领地地图颜色失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_SetMapColorFailed);
DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name); DominionDTO dominion = getExistDomAndIsOwner(operator, dom_name);
if (dominion == null) { if (dominion == null) {
return; return;
} }
if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者", dom_name));
return;
}
color = color.toUpperCase(); // 转换为大写 color = color.toUpperCase(); // 转换为大写
if (!color.matches("^#[0-9a-fA-F]{6}$")) { if (!color.matches("^#[0-9a-fA-F]{6}$")) {
operator.setResponse(FAIL.addMessage("颜色格式不正确")); operator.setResponse(FAIL.addMessage(Translation.Messages_MapColorInvalid));
return; return;
} }
dominion.setColor(color); dominion.setColor(color);
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "成功设置领地 %s 的卫星地图颜色为 %s", dom_name, color)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_SetMapColorSuccess, dom_name, color));
} }
/** /**
@ -617,10 +622,10 @@ public class DominionController {
* @param color 16进制颜色 例如 #ff0000 * @param color 16进制颜色 例如 #ff0000
*/ */
public static void setMapColor(AbstractOperator operator, String color) { public static void setMapColor(AbstractOperator operator, String color) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置领地地图颜色失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_SetMapColorFailed);
DominionDTO dominion = getPlayerCurrentDominion(operator); DominionDTO dominion = getPlayerCurrentDominion(operator);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("无法获取你所处的领地,请指定名称")); operator.setResponse(FAIL.addMessage(Translation.Messages_CannotGetDominionAuto));
return; return;
} }
setMapColor(operator, color, dominion.getName()); setMapColor(operator, color, dominion.getName());
@ -699,7 +704,7 @@ public class DominionController {
} }
private static boolean sizeNotValid(AbstractOperator operator, int x1, int y1, int z1, int x2, int y2, int z2) { private static boolean sizeNotValid(AbstractOperator operator, int x1, int y1, int z1, int x2, int y2, int z2) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "尺寸不合法"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_SizeInvalid);
if (operator.isOp() && Dominion.config.getLimitOpBypass()) { if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false; return false;
} }
@ -722,35 +727,43 @@ 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("领地的任意一边长度不得小于4")); 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("领地X方向长度不能超过 %d", 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("领地Y方向高度不能超过 %d", 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("领地Z方向长度不能超过 %d", 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())) {
operator.setResponse(FAIL.addMessage("领地Y坐标不能超过 %d", Dominion.config.getLimitMaxY(operator.getPlayer()))); operator.setResponse(FAIL.addMessage(Translation.Messages_MaxYShouldBeLessThan, Dominion.config.getLimitMaxY(operator.getPlayer())));
return true; return true;
} }
if (y1 < Dominion.config.getLimitMinY(operator.getPlayer())) { if (y1 < Dominion.config.getLimitMinY(operator.getPlayer())) {
operator.setResponse(FAIL.addMessage("领地Y坐标不能低于 %d", Dominion.config.getLimitMinY(operator.getPlayer()))); operator.setResponse(FAIL.addMessage(Translation.Messages_MinYShouldBeLessThan, Dominion.config.getLimitMinY(operator.getPlayer())));
return true; return true;
} }
return false; return false;
} }
private static boolean depthNotValid(AbstractOperator operator, DominionDTO parent_dom) { private static boolean depthNotValid(AbstractOperator operator, DominionDTO parent_dom) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "子领地深度不合法"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_DepthInvalid);
if (operator.isOp() && Dominion.config.getLimitOpBypass()) { if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
return false; return false;
} }
@ -758,7 +771,7 @@ public class DominionController {
return false; return false;
} }
if (parent_dom.getId() != -1 && Dominion.config.getLimitDepth(operator.getPlayer()) == 0) { if (parent_dom.getId() != -1 && Dominion.config.getLimitDepth(operator.getPlayer()) == 0) {
operator.setResponse(FAIL.addMessage("不允许创建子领地")); operator.setResponse(FAIL.addMessage(Translation.Messages_CreateSubDominionDisabled));
return true; return true;
} }
if (parent_dom.getId() == -1) { if (parent_dom.getId() == -1) {
@ -770,7 +783,7 @@ public class DominionController {
level++; level++;
} }
if (level >= Dominion.config.getLimitDepth(operator.getPlayer())) { if (level >= Dominion.config.getLimitDepth(operator.getPlayer())) {
operator.setResponse(FAIL.addMessage("子领地嵌套深度不能超过 %d", Dominion.config.getLimitDepth(operator.getPlayer()))); operator.setResponse(FAIL.addMessage(Translation.Messages_DepthShouldBeLessThan, Dominion.config.getLimitDepth(operator.getPlayer())));
return true; return true;
} }
return false; return false;
@ -794,11 +807,11 @@ public class DominionController {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, ""); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "");
DominionDTO dominion = DominionDTO.select(dominion_name); DominionDTO dominion = DominionDTO.select(dominion_name);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominion_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, dominion_name));
return null; return null;
} }
if (notOwner(operator, dominion)) { if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者", dominion_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwner, dominion_name));
return null; return null;
} }
return dominion; return dominion;
@ -816,25 +829,25 @@ public class DominionController {
private static boolean handleEconomyFailed(AbstractOperator operator, Integer count, boolean paid, AbstractOperator.Result FAIL, AbstractOperator.Result SUCCESS) { private static boolean handleEconomyFailed(AbstractOperator operator, Integer count, boolean paid, AbstractOperator.Result FAIL, AbstractOperator.Result SUCCESS) {
if (Dominion.config.getEconomyEnable()) { if (Dominion.config.getEconomyEnable()) {
if (!VaultConnect.instance.economyAvailable()) { if (!VaultConnect.instance.economyAvailable()) {
operator.setResponse(FAIL.addMessage("没有可用的经济插件系统,请联系服主。")); operator.setResponse(FAIL.addMessage(Translation.Messages_NoEconomyPlugin));
return true; return true;
} }
if (operator.isOp() && Dominion.config.getLimitOpBypass()) { if (operator.isOp() && Dominion.config.getLimitOpBypass()) {
SUCCESS.addMessage("你是OP已跳过经济检查。"); SUCCESS.addMessage(Translation.Messages_OpBypassEconomyCheck);
return false; return false;
} }
float priceOrRefund = count * Dominion.config.getEconomyPrice(operator.getPlayer()); float priceOrRefund = count * Dominion.config.getEconomyPrice(operator.getPlayer());
if (paid) { if (paid) {
if (VaultConnect.instance.getBalance(operator.getPlayer()) < priceOrRefund) { if (VaultConnect.instance.getBalance(operator.getPlayer()) < priceOrRefund) {
operator.setResponse(FAIL.addMessage("你的余额不足,需要 %.2f %s", priceOrRefund, VaultConnect.instance.currencyNamePlural())); operator.setResponse(FAIL.addMessage(Translation.Messages_NotEnoughMoney, priceOrRefund, VaultConnect.instance.currencyNamePlural()));
return true; return true;
} }
SUCCESS.addMessage("已扣除 %.2f %s", priceOrRefund, VaultConnect.instance.currencyNamePlural()); SUCCESS.addMessage(Translation.Messages_ChargeMoney, priceOrRefund, VaultConnect.instance.currencyNamePlural());
VaultConnect.instance.withdrawPlayer(operator.getPlayer(), priceOrRefund); VaultConnect.instance.withdrawPlayer(operator.getPlayer(), priceOrRefund);
} else { } else {
float refund = priceOrRefund * Dominion.config.getEconomyRefund(operator.getPlayer()); float refund = priceOrRefund * Dominion.config.getEconomyRefund(operator.getPlayer());
VaultConnect.instance.depositPlayer(operator.getPlayer(), refund); VaultConnect.instance.depositPlayer(operator.getPlayer(), refund);
SUCCESS.addMessage("已退还 %.2f %s", refund, VaultConnect.instance.currencyNamePlural()); SUCCESS.addMessage(Translation.Messages_RefundMoney, refund, VaultConnect.instance.currencyNamePlural());
} }
} }
return false; return false;
@ -857,15 +870,15 @@ public class DominionController {
return null; return null;
} }
if (operator.getLocation() == null) { if (operator.getLocation() == null) {
operator.setResponse(FAIL.addMessage("无法获取你的位置")); operator.setResponse(FAIL.addMessage(Translation.Messages_CannotGetLocation));
return null; return null;
} }
if (!operator.getLocation().getWorld().getUID().equals(dominion.getWorldUid())) { if (!operator.getLocation().getWorld().getUID().equals(dominion.getWorldUid())) {
operator.setResponse(FAIL.addMessage("禁止跨世界操作")); operator.setResponse(FAIL.addMessage(Translation.Messages_CrossWorldOperationDisallowed));
return null; return null;
} }
if (!isInDominion(dominion, operator.getLocation())) { if (!isInDominion(dominion, operator.getLocation())) {
operator.setResponse(FAIL.addMessage("你不在领地 %s 内,无法执行此操作", dominion.getName())); operator.setResponse(FAIL.addMessage(Translation.Messages_NotInDominion, dominion.getName()));
return null; return null;
} }
return dominion; return dominion;
@ -874,7 +887,7 @@ public class DominionController {
private static int[] expandContractSizeChange(AbstractOperator operator, @NotNull DominionDTO dominion, boolean expand, int size, AbstractOperator.Result FAIL) { private static int[] expandContractSizeChange(AbstractOperator operator, @NotNull DominionDTO dominion, boolean expand, int size, AbstractOperator.Result FAIL) {
BlockFace face = operator.getDirection(); BlockFace face = operator.getDirection();
if (face == null) { if (face == null) {
operator.setResponse(FAIL.addMessage("无法获取你的方向")); operator.setResponse(FAIL.addMessage(Translation.Messages_CannotGetDirection));
return null; return null;
} }
int[] result = new int[6]; int[] result = new int[6];
@ -907,13 +920,13 @@ public class DominionController {
result[1] -= size; result[1] -= size;
break; break;
default: default:
operator.setResponse(FAIL.addMessage("无效的方向")); operator.setResponse(FAIL.addMessage(Translation.Messages_InvalidDirection, face));
return null; return null;
} }
if (!expand) { if (!expand) {
// 校验第二组坐标是否小于第一组坐标 // 校验第二组坐标是否小于第一组坐标
if (result[0] > result[3] || result[1] > result[4] || result[2] > result[5]) { if (result[0] > result[3] || result[1] > result[4] || result[2] > result[5]) {
operator.setResponse(FAIL.addMessage("缩小后的领地大小无效")); operator.setResponse(FAIL.addMessage(Translation.Messages_ContractSizeInvalid));
return null; return null;
} }
} }
@ -937,7 +950,7 @@ public class DominionController {
} }
if (!sub_dominions.isEmpty()) { if (!sub_dominions.isEmpty()) {
sub_names = sub_names.substring(0, sub_names.length() - 2); sub_names = sub_names.substring(0, sub_names.length() - 2);
WARNING.addMessage("(子领地:%s)", sub_names); WARNING.addMessage(Translation.Messages_SubDominionList, sub_names);
} }
} }

View File

@ -2,6 +2,7 @@ package cn.lunadeer.dominion.controllers;
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.dominion.utils.ControllerUtils; import cn.lunadeer.dominion.utils.ControllerUtils;
import static cn.lunadeer.dominion.utils.ControllerUtils.noAuthToChangeFlags; import static cn.lunadeer.dominion.utils.ControllerUtils.noAuthToChangeFlags;
@ -19,7 +20,7 @@ public class FlagsController {
DominionDTO dominion = ControllerUtils.getPlayerCurrentDominion(operator); DominionDTO dominion = ControllerUtils.getPlayerCurrentDominion(operator);
if (dominion == null) return; if (dominion == null) return;
setFlag(operator, flag, value, dominion.getName()); setFlag(operator, flag, value, dominion.getName());
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置领地权限 %s 为 %s", flag, value)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_SetDominionFlagSuccess, flag, value));
} }
/** /**
@ -33,16 +34,16 @@ public class FlagsController {
public static void setFlag(AbstractOperator operator, String flag, boolean value, String dominionName) { public static void setFlag(AbstractOperator operator, String flag, boolean value, String dominionName) {
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "领地 %s 不存在", dominionName)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_DominionNotExist, dominionName));
return; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return; if (noAuthToChangeFlags(operator, dominion)) return;
Flag f = Flag.getFlag(flag); Flag f = Flag.getFlag(flag);
if (f == null) { if (f == null) {
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "未知的领地权限 %s", flag)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_UnknownFlag, flag));
return; return;
} }
dominion.setFlagValue(f, value); dominion.setFlagValue(f, value);
operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置领地权限 %s 为 %s", flag, value)); operator.setResponse(new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_SetDominionFlagSuccess, flag, value));
} }
} }

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.controllers; package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.*; import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.managers.Translation;
import java.util.Objects; import java.util.Objects;
@ -18,29 +19,29 @@ public class GroupController {
* @param nameColored 权限组名称带颜色 * @param nameColored 权限组名称带颜色
*/ */
public static void createGroup(AbstractOperator operator, String domName, String groupName, String nameColored) { public static void createGroup(AbstractOperator operator, String domName, String groupName, String nameColored) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建权限组 %s 失败", groupName); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_CreateGroupFailed, groupName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建权限组 %s 成功", groupName); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_CreateGroupSuccess, groupName);
if (groupName.contains(" ")) { if (groupName.contains(" ")) {
operator.setResponse(FAIL.addMessage("权限组名称不能包含空格")); operator.setResponse(FAIL.addMessage(Translation.Messages_GroupNameInvalid));
return; return;
} }
DominionDTO dominion = DominionDTO.select(domName); DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, domName));
return; return;
} }
if (notOwner(operator, dominion)) { if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法创建权限组", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwner, domName));
return; return;
} }
GroupDTO group = GroupDTO.select(dominion.getId(), groupName); GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group != null) { if (group != null) {
operator.setResponse(FAIL.addMessage("领地 %s 已存在名为 %s 的权限组", domName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_GroupNameExist, domName, groupName));
return; return;
} }
group = GroupDTO.create(nameColored, dominion); group = GroupDTO.create(nameColored, dominion);
if (group == null) { if (group == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员")); operator.setResponse(FAIL.addMessage(Translation.Messages_DatabaseError));
return; return;
} }
operator.setResponse(SUCCESS); operator.setResponse(SUCCESS);
@ -54,20 +55,20 @@ public class GroupController {
* @param groupName 权限组名称 * @param groupName 权限组名称
*/ */
public static void deleteGroup(AbstractOperator operator, String domName, String groupName) { public static void deleteGroup(AbstractOperator operator, String domName, String groupName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "删除权限组 %s 失败", groupName); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_DeleteGroupFailed, groupName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "删除权限组 %s 成功", groupName); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_DeleteGroupSuccess, groupName);
DominionDTO dominion = DominionDTO.select(domName); DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, domName));
return; return;
} }
if (notOwner(operator, dominion)) { if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法删除权限组", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwner, domName));
return; return;
} }
GroupDTO group = GroupDTO.select(dominion.getId(), groupName); GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) { if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_GroupNotExist, domName, groupName));
return; return;
} }
group.delete(); group.delete();
@ -84,11 +85,11 @@ public class GroupController {
* @param value 权限值 * @param value 权限值
*/ */
public static void setGroupFlag(AbstractOperator operator, String domName, String groupName, String flag, boolean value) { public static void setGroupFlag(AbstractOperator operator, String domName, String groupName, String flag, boolean value) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置权限组 %s 的权限 %s 为 %s 失败", groupName, flag, value); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_SetGroupFlagFailed, groupName, flag, value);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置权限组 %s 的权限 %s 为 %s 成功", groupName, flag, value); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_SetGroupFlagSuccess, groupName, flag, value);
DominionDTO dominion = DominionDTO.select(domName); DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, domName));
return; return;
} }
if (noAuthToChangeFlags(operator, dominion)) { if (noAuthToChangeFlags(operator, dominion)) {
@ -96,11 +97,11 @@ public class GroupController {
} }
GroupDTO group = GroupDTO.select(dominion.getId(), groupName); GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) { if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_GroupNotExist, domName, groupName));
return; return;
} }
if ((flag.equals("admin") || group.getAdmin()) && notOwner(operator, dominion)) { if ((flag.equals("admin") || group.getAdmin()) && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改管理员权限组权限", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwnerForGroup, domName));
return; return;
} }
if (flag.equals("admin")) { if (flag.equals("admin")) {
@ -108,13 +109,13 @@ public class GroupController {
} else { } else {
Flag f = Flag.getFlag(flag); Flag f = Flag.getFlag(flag);
if (f == null) { if (f == null) {
operator.setResponse(FAIL.addMessage("未知的权限 %s", flag)); operator.setResponse(FAIL.addMessage(Translation.Messages_UnknownFlag, flag));
return; return;
} }
group = group.setFlagValue(f, value); group = group.setFlagValue(f, value);
} }
if (group == null) { if (group == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员")); operator.setResponse(FAIL.addMessage(Translation.Messages_DatabaseError));
return; return;
} }
operator.setResponse(SUCCESS); operator.setResponse(SUCCESS);
@ -130,29 +131,29 @@ public class GroupController {
* @param nameColored 新名称带颜色 * @param nameColored 新名称带颜色
*/ */
public static void renameGroup(AbstractOperator operator, String domName, String oldName, String newName, String nameColored) { public static void renameGroup(AbstractOperator operator, String domName, String oldName, String newName, String nameColored) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "重命名权限组 %s 为 %s 失败", oldName, newName); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_RenameGroupFailed, oldName, newName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "重命名权限组 %s 为 %s 成功", oldName, newName); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_RenameGroupSuccess, oldName, newName);
if (newName.contains(" ")) { if (newName.contains(" ")) {
operator.setResponse(FAIL.addMessage("权限组名称不能包含空格")); operator.setResponse(FAIL.addMessage(Translation.Messages_GroupNameInvalid));
return; return;
} }
DominionDTO dominion = DominionDTO.select(domName); DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, domName));
return; return;
} }
if (notOwner(operator, dominion)) { if (notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法重命名权限组", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwner, domName));
return; return;
} }
GroupDTO group = GroupDTO.select(dominion.getId(), oldName); GroupDTO group = GroupDTO.select(dominion.getId(), oldName);
if (group == null) { if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, oldName)); operator.setResponse(FAIL.addMessage(Translation.Messages_GroupNotExist, domName, oldName));
return; return;
} }
group = group.setName(nameColored); group = group.setName(nameColored);
if (group == null) { if (group == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员")); operator.setResponse(FAIL.addMessage(Translation.Messages_DatabaseError));
return; return;
} }
operator.setResponse(SUCCESS); operator.setResponse(SUCCESS);
@ -167,47 +168,47 @@ public class GroupController {
* @param playerName 玩家名称 * @param playerName 玩家名称
*/ */
public static void addMember(AbstractOperator operator, String domName, String groupName, String playerName) { public static void addMember(AbstractOperator operator, String domName, String groupName, String playerName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "添加成员 %s 到权限组 %s 失败", playerName, groupName); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_AddGroupMemberFailed, playerName, groupName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "添加成员 %s 到权限组 %s 成功", playerName, groupName); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_AddGroupMemberSuccess, playerName, groupName);
DominionDTO dominion = DominionDTO.select(domName); DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, domName));
return; return;
} }
GroupDTO group = GroupDTO.select(dominion.getId(), groupName); GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) { if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_GroupNotExist, domName, groupName));
return; return;
} }
if (noAuthToChangeFlags(operator, dominion)) { if (noAuthToChangeFlags(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你没有权限修改领地 %s 的权限组 %s 成员", domName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NoPermissionForGroupMember, domName, groupName));
return; return;
} }
if (group.getAdmin() && notOwner(operator, dominion)) { if (group.getAdmin() && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法添加成员到管理员权限组", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwnerForGroupMember, domName));
return; return;
} }
PlayerDTO player = PlayerDTO.select(playerName); PlayerDTO player = PlayerDTO.select(playerName);
if (player == null) { if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在", playerName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotExist, playerName));
return; return;
} }
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) { if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员,无法直接加入权限组", playerName, domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotDominionMember, playerName, domName));
return; return;
} }
if (Objects.equals(privilege.getGroupId(), group.getId())) { if (Objects.equals(privilege.getGroupId(), group.getId())) {
operator.setResponse(FAIL.addMessage("玩家 %s 已在权限组 %s 中", playerName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerAlreadyInGroup, playerName, groupName));
return; return;
} }
if (notOwner(operator, dominion) && privilege.getAdmin()) { if (notOwner(operator, dominion) && privilege.getAdmin()) {
operator.setResponse(FAIL.addMessage("%s 是管理员,你不是领地 %s 的拥有者,无法添加管理员到权限组", playerName, domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerIsOwnerForGroupMember, playerName, domName));
return; return;
} }
privilege = privilege.setGroupId(group.getId()); privilege = privilege.setGroupId(group.getId());
if (privilege == null) { if (privilege == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员")); operator.setResponse(FAIL.addMessage(Translation.Messages_DatabaseError));
return; return;
} }
operator.setResponse(SUCCESS); operator.setResponse(SUCCESS);
@ -222,43 +223,43 @@ public class GroupController {
* @param playerName 玩家名称 * @param playerName 玩家名称
*/ */
public static void removeMember(AbstractOperator operator, String domName, String groupName, String playerName) { public static void removeMember(AbstractOperator operator, String domName, String groupName, String playerName) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "从权限组 %s 移除成员 %s 失败", groupName, playerName); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_RemoveGroupMemberFailed, groupName, playerName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "从权限组 %s 移除成员 %s 成功", groupName, playerName); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_RemoveGroupMemberSuccess, groupName, playerName);
DominionDTO dominion = DominionDTO.select(domName); DominionDTO dominion = DominionDTO.select(domName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, domName));
return; return;
} }
GroupDTO group = GroupDTO.select(dominion.getId(), groupName); GroupDTO group = GroupDTO.select(dominion.getId(), groupName);
if (group == null) { if (group == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在名为 %s 的权限组", domName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_GroupNotExist, domName, groupName));
return; return;
} }
if (noAuthToChangeFlags(operator, dominion)) { if (noAuthToChangeFlags(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你没有权限移除领地 %s 的权限组 %s 成员", domName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NoPermissionForRemoveGroupMember, domName, groupName));
return; return;
} }
if (group.getAdmin() && notOwner(operator, dominion)) { if (group.getAdmin() && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法从管理员权限组移除成员", domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwnerForRemoveGroupMember, domName));
return; return;
} }
PlayerDTO player = PlayerDTO.select(playerName); PlayerDTO player = PlayerDTO.select(playerName);
if (player == null) { if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在", playerName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotExist, playerName));
return; return;
} }
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) { if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", playerName, domName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotMember, playerName, domName));
return; return;
} }
if (!Objects.equals(privilege.getGroupId(), group.getId())) { if (!Objects.equals(privilege.getGroupId(), group.getId())) {
operator.setResponse(FAIL.addMessage("玩家 %s 不在权限组 %s 中", playerName, groupName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotInGroup, playerName, groupName));
return; return;
} }
privilege = privilege.setGroupId(-1); privilege = privilege.setGroupId(-1);
if (privilege == null) { if (privilege == null) {
operator.setResponse(FAIL.addMessage("请联系服务器管理员")); operator.setResponse(FAIL.addMessage(Translation.Messages_DatabaseError));
return; return;
} }
operator.setResponse(SUCCESS); operator.setResponse(SUCCESS);

View File

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.controllers; package cn.lunadeer.dominion.controllers;
import cn.lunadeer.dominion.dtos.*; import cn.lunadeer.dominion.dtos.*;
import cn.lunadeer.dominion.managers.Translation;
import static cn.lunadeer.dominion.utils.ControllerUtils.*; import static cn.lunadeer.dominion.utils.ControllerUtils.*;
@ -14,26 +15,26 @@ public class MemberController {
* @param dominionName 领地名称 * @param dominionName 领地名称
*/ */
public static void memberRemove(AbstractOperator operator, String dominionName, String player_name) { public static void memberRemove(AbstractOperator operator, String dominionName, String player_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "将玩家 %s 从领地 %s 移除失败", player_name, dominionName); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_RemoveMemberFailed, player_name, dominionName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "将玩家 %s 从领地 %s 移除成功", player_name, dominionName); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_RemoveMemberSuccess, player_name, dominionName);
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, dominionName));
return; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return; if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name); PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) { if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotExist, player_name));
return; return;
} }
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) { if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotMember, player_name, dominionName));
return; return;
} }
if (isAdmin(privilege) && notOwner(operator, dominion)) { if (isAdmin(privilege) && notOwner(operator, dominion)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法移除一个领地管理员", dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwnerForRemoveAdmin, dominionName));
return; return;
} }
MemberDTO.delete(player.getUuid(), dominion.getId()); MemberDTO.delete(player.getUuid(), dominion.getId());
@ -50,31 +51,31 @@ public class MemberController {
* @param dominionName 领地名称 * @param dominionName 领地名称
*/ */
public static void setMemberFlag(AbstractOperator operator, String dominionName, String player_name, String flag, boolean value) { public static void setMemberFlag(AbstractOperator operator, String dominionName, String player_name, String flag, boolean value) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 失败", player_name, dominionName, flag, value); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_SetMemberFlagFailed, player_name, dominionName, flag, value);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置玩家 %s 在领地 %s 的权限 %s 为 %s 成功", player_name, dominionName, flag, value); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_SetMemberFlagSuccess, player_name, dominionName, flag, value);
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, dominionName));
return; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return; if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name); PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) { if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotExist, player_name));
return; return;
} }
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) { if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", player_name, dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotMember, player_name, dominionName));
return; return;
} }
GroupDTO group = GroupDTO.select(privilege.getGroupId()); GroupDTO group = GroupDTO.select(privilege.getGroupId());
if (group != null) { if (group != null) {
operator.setResponse(FAIL.addMessage("玩家 %s 属于 %s 权限组,无法单独设置权限", 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)) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他玩家管理员的权限", dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwnerForSetAdmin, dominionName));
return; return;
} }
if (flag.equals("admin")) { if (flag.equals("admin")) {
@ -82,7 +83,7 @@ public class MemberController {
} else { } else {
Flag f = Flag.getFlag(flag); Flag f = Flag.getFlag(flag);
if (f == null) { if (f == null) {
operator.setResponse(FAIL.addMessage("未知的领地权限 %s", flag)); operator.setResponse(FAIL.addMessage(Translation.Messages_UnknownFlag, flag));
return; return;
} }
privilege.setFlagValue(f, value); privilege.setFlagValue(f, value);
@ -91,26 +92,26 @@ public class MemberController {
} }
public static void memberAdd(AbstractOperator operator, String dominionName, String player_name) { public static void memberAdd(AbstractOperator operator, String dominionName, String player_name) {
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "将玩家 %s 添加到领地成员 %s 失败", player_name, dominionName); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_AddMemberFailed, player_name, dominionName);
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "将玩家 %s 添加到领地成员 %s 成功", player_name, dominionName); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_AddMemberSuccess, player_name, dominionName);
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, dominionName));
return; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return; if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerController.getPlayerDTO(player_name); PlayerDTO player = PlayerController.getPlayerDTO(player_name);
if (player == null) { if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", player_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotExist, player_name));
return; return;
} }
if (dominion.getOwner().equals(player.getUuid())) { if (dominion.getOwner().equals(player.getUuid())) {
operator.setResponse(FAIL.addMessage("玩家 %s 是领地 %s 的拥有者,不可以被添加为成员", player_name, dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_OwnerCannotBeMember, player_name, dominionName));
return; return;
} }
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege != null) { if (privilege != null) {
operator.setResponse(FAIL.addMessage("玩家 %s 已经是领地 %s 的成员", player_name, dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerAlreadyMember, player_name, dominionName));
return; return;
} }
privilege = MemberDTO.insert(new MemberDTO(player.getUuid(), dominion)); privilege = MemberDTO.insert(new MemberDTO(player.getUuid(), dominion));
@ -122,31 +123,31 @@ public class MemberController {
} }
public static void applyTemplate(AbstractOperator operator, String dominionName, String playerName, String templateName) { public static void applyTemplate(AbstractOperator operator, String dominionName, String playerName, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "应用模板 %s 到玩家 %s 在领地 %s 的权限成功", templateName, playerName, dominionName); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_ApplyTemplateSuccess, templateName, playerName, dominionName);
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "应用模板 %s 到玩家 %s 在领地 %s 的权限失败", templateName, playerName, dominionName); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_ApplyTemplateFailed, templateName, playerName, dominionName);
DominionDTO dominion = DominionDTO.select(dominionName); DominionDTO dominion = DominionDTO.select(dominionName);
if (dominion == null) { if (dominion == null) {
operator.setResponse(FAIL.addMessage("领地 %s 不存在", dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_DominionNotExist, dominionName));
return; return;
} }
if (noAuthToChangeFlags(operator, dominion)) return; if (noAuthToChangeFlags(operator, dominion)) return;
PlayerDTO player = PlayerDTO.select(playerName); PlayerDTO player = PlayerDTO.select(playerName);
if (player == null) { if (player == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不存在或没有登录过", playerName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotExist, playerName));
return; return;
} }
MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId()); MemberDTO privilege = MemberDTO.select(player.getUuid(), dominion.getId());
if (privilege == null) { if (privilege == null) {
operator.setResponse(FAIL.addMessage("玩家 %s 不是领地 %s 的成员", playerName, dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerNotMember, playerName, dominionName));
return; return;
} }
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName); PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName);
if (template == null) { if (template == null) {
operator.setResponse(FAIL.addMessage("模板 %s 不存在", templateName)); operator.setResponse(FAIL.addMessage(Translation.Messages_TemplateNotExist, templateName));
return; return;
} }
if (notOwner(operator, dominion) && (isAdmin(privilege) || template.getAdmin())) { if (notOwner(operator, dominion) && (isAdmin(privilege) || template.getAdmin())) {
operator.setResponse(FAIL.addMessage("你不是领地 %s 的拥有者,无法修改其他管理员的权限", dominionName)); operator.setResponse(FAIL.addMessage(Translation.Messages_NotDominionOwnerForSetAdmin, dominionName));
return; return;
} }
privilege = privilege.applyTemplate(template); privilege = privilege.applyTemplate(template);

View File

@ -2,6 +2,7 @@ package cn.lunadeer.dominion.controllers;
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 java.util.List; import java.util.List;
@ -14,25 +15,25 @@ public class TemplateController {
* @param templateName 模板名称 * @param templateName 模板名称
*/ */
public static void createTemplate(AbstractOperator operator, String templateName) { public static void createTemplate(AbstractOperator operator, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "创建成功"); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_CreateTemplateSuccess, templateName);
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "创建失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_CreateTemplateFailed, templateName);
if (templateName.contains(" ")) { if (templateName.contains(" ")) {
operator.setResponse(FAIL.addMessage("模板名称不能包含空格")); operator.setResponse(FAIL.addMessage(Translation.Messages_TemplateNameInvalid));
return; return;
} }
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(operator.getUniqueId()); List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(operator.getUniqueId());
for (PrivilegeTemplateDTO template : templates) { for (PrivilegeTemplateDTO template : templates) {
if (template.getName().equals(templateName)) { if (template.getName().equals(templateName)) {
operator.setResponse(FAIL.addMessage("已经存在名为 %s 的权限模板", templateName)); operator.setResponse(FAIL.addMessage(Translation.Messages_TemplateNameExist, templateName));
return; return;
} }
} }
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.create(operator.getUniqueId(), templateName); PrivilegeTemplateDTO template = PrivilegeTemplateDTO.create(operator.getUniqueId(), templateName);
if (template == null) { if (template == null) {
operator.setResponse(FAIL.addMessage("可能是数据库错误,请联系管理员")); operator.setResponse(FAIL.addMessage(Translation.Messages_DatabaseError));
return; return;
} }
operator.setResponse(SUCCESS.addMessage("成功创建名为 %s 的权限模板", templateName)); operator.setResponse(SUCCESS);
} }
/** /**
@ -42,15 +43,15 @@ public class TemplateController {
* @param templateName 模板名称 * @param templateName 模板名称
*/ */
public static void deleteTemplate(AbstractOperator operator, String templateName) { public static void deleteTemplate(AbstractOperator operator, String templateName) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "删除成功"); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_DeleteTemplateSuccess, templateName);
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "删除失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_DeleteTemplateFailed, templateName);
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName); PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName);
if (template == null) { if (template == null) {
operator.setResponse(FAIL.addMessage("模板不存在")); operator.setResponse(FAIL.addMessage(Translation.Messages_TemplateNotExist, templateName));
return; return;
} }
if (!template.getCreator().equals(operator.getUniqueId())) { if (!template.getCreator().equals(operator.getUniqueId())) {
operator.setResponse(FAIL.addMessage("这不是你的模板")); operator.setResponse(FAIL.addMessage(Translation.Messages_TemplateNotExist, templateName));
return; return;
} }
PrivilegeTemplateDTO.delete(operator.getUniqueId(), templateName); PrivilegeTemplateDTO.delete(operator.getUniqueId(), templateName);
@ -66,11 +67,11 @@ public class TemplateController {
* @param value 权限值 * @param value 权限值
*/ */
public static void setTemplateFlag(AbstractOperator operator, String templateName, String flag_name, boolean value) { public static void setTemplateFlag(AbstractOperator operator, String templateName, String flag_name, boolean value) {
AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, "设置成功"); AbstractOperator.Result SUCCESS = new AbstractOperator.Result(AbstractOperator.Result.SUCCESS, Translation.Messages_SetTemplateFlagSuccess, templateName, flag_name, value);
AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "设置失败"); AbstractOperator.Result FAIL = new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_SetTemplateFlagFailed, templateName, flag_name, value);
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName); PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(operator.getUniqueId(), templateName);
if (template == null) { if (template == null) {
operator.setResponse(FAIL.addMessage("模板不存在")); operator.setResponse(FAIL.addMessage(Translation.Messages_TemplateNotExist, templateName));
return; return;
} }
if (flag_name.equals("admin")) { if (flag_name.equals("admin")) {
@ -78,12 +79,12 @@ public class TemplateController {
} else { } else {
Flag f = Flag.getFlag(flag_name); Flag f = Flag.getFlag(flag_name);
if (f == null) { if (f == null) {
operator.setResponse(FAIL.addMessage("未知的权限 %s", flag_name)); operator.setResponse(FAIL.addMessage(Translation.Messages_UnknownFlag, flag_name));
return; return;
} }
template.setFlagValue(f, value); template.setFlagValue(f, value);
} }
operator.setResponse(SUCCESS.addMessage("成功设置模板 " + template.getName() + " 的权限 " + flag_name + "" + value)); operator.setResponse(SUCCESS);
} }
} }

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,29 +2,34 @@ 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.HashMap; import java.util.*;
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);
_plugin = plugin; _plugin = plugin;
_plugin.saveDefaultConfig(); _plugin.saveDefaultConfig();
reload(); reload();
_plugin.saveConfig();
} }
public void reload() { public void reload() {
_plugin.reloadConfig(); _plugin.reloadConfig();
_file = _plugin.getConfig(); _file = _plugin.getConfig();
_language = _file.getString("Language", "zh-cn");
Translation.instance.loadLocale(_language);
_debug = _file.getBoolean("Debug", false); _debug = _file.getBoolean("Debug", false);
_timer = _file.getBoolean("Timer", false); _timer = _file.getBoolean("Timer", false);
XLogger.setDebug(_debug); XLogger.setDebug(_debug);
@ -34,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("AutoCreateRadius 不能等于 0已重置为 10"); _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("AutoCleanAfterDays 不能等于 0已重置为 180");
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("工具名称设置错误,已重置为 ARROW");
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);
@ -68,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));
limits.put("default", defaultGroup); ConfigurationSection worldSettings = _file.getConfigurationSection("Limit.WorldSettings");
if (defaultGroup.getLimitSizeX() <= 4 && defaultGroup.getLimitSizeX() != -1) { if (worldSettings != null) {
XLogger.err("Limit.SizeX 尺寸不能小于 4已重置为 128"); defaultGroup.addWorldLimits(WorldSetting.load("config.yml", worldSettings));
setLimitSizeX(128);
}
if (defaultGroup.getLimitSizeY() <= 4 && defaultGroup.getLimitSizeY() != -1) {
XLogger.err("Limit.SizeY 尺寸不能小于 4已重置为 64");
setLimitSizeY(64);
}
if (defaultGroup.getLimitSizeZ() <= 4 && defaultGroup.getLimitSizeZ() != -1) {
XLogger.err("Limit.SizeZ 尺寸不能小于 4已重置为 128");
setLimitSizeZ(128);
}
if (defaultGroup.getLimitMinY() >= defaultGroup.getLimitMaxY()) {
XLogger.err("Limit.MinY 不能大于或等于 Limit.MaxY已重置为 -64 320");
setLimitMinY(-64);
setLimitMaxY(320);
}
if (defaultGroup.getRefundRatio() < 0.0 || defaultGroup.getRefundRatio() > 1.0) {
XLogger.err("Economy.Refund 设置不合法,已重置为 0.85");
setEconomyRefund(0.85f);
}
if (defaultGroup.getPrice() < 0.0) {
XLogger.err("Economy.Price 设置不合法,已重置为 10.0");
setEconomyPrice(10.0f);
}
if (defaultGroup.getLimitVert() && defaultGroup.getLimitSizeY() <= defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY()) {
XLogger.warn("启用 Limit.Vert 时 Limit.SizeY 不能小于 Limit.MaxY - Limit.MinY已自动调整为 " + (defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY() + 1));
setLimitSizeY(defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY() + 1);
}
if (defaultGroup.getLimitAmount() < 0 && defaultGroup.getLimitAmount() != -1) {
XLogger.err("Limit.Amount 设置不合法,已重置为 10");
setLimitAmount(10);
}
if (defaultGroup.getLimitDepth() < 0 && defaultGroup.getLimitDepth() != -1) {
XLogger.err("Limit.Depth 设置不合法,已重置为 3");
setLimitDepth(3);
} }
groupLimits.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() {
@ -142,37 +123,85 @@ public class ConfigManager {
_file.set("Database.User", _db_user); _file.set("Database.User", _db_user);
_file.set("Database.Pass", _db_pass); _file.set("Database.Pass", _db_pass);
_file.set("AutoCreateRadius", _auto_create_radius); _file.set("Language", _language);
_file.setComments("Language", List.of(Translation.Config_Comment_Language.trans()));
_file.set("AutoCreateRadius", _auto_create_radius);
_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.set("Limit.SpawnProtection", _spawn_protection); _file.set("Limit.SpawnProtection", _spawn_protection);
_file.set("Limit.MinY", limits.get("default").getLimitMinY()); _file.setInlineComments("Limit.SpawnProtection", List.of(Translation.Config_Comment_SpawnProtectRadius.trans() + Translation.Config_Comment_NegativeOneDisabled.trans()));
_file.set("Limit.MaxY", limits.get("default").getLimitMaxY()); _file.set("Limit.MinY", groupLimits.get("default").getLimitMinY(null));
_file.set("Limit.SizeX", limits.get("default").getLimitSizeX()); _file.setInlineComments("Limit.MinY", List.of(Translation.Config_Comment_MinY.trans()));
_file.set("Limit.SizeY", limits.get("default").getLimitSizeY()); _file.set("Limit.MaxY", groupLimits.get("default").getLimitMaxY(null));
_file.set("Limit.SizeZ", limits.get("default").getLimitSizeZ()); _file.setInlineComments("Limit.MaxY", List.of(Translation.Config_Comment_MaxY.trans()));
_file.set("Limit.Amount", limits.get("default").getLimitAmount()); _file.set("Limit.Size.MaxX", groupLimits.get("default").getLimitSizeMaxX(null));
_file.set("Limit.Depth", limits.get("default").getLimitDepth()); _file.setInlineComments("Limit.Size.MaxX", List.of(Translation.Config_Comment_SizeMaxX.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
_file.set("Limit.Vert", limits.get("default").getLimitVert()); _file.set("Limit.Size.MaxY", groupLimits.get("default").getLimitSizeMaxY(null));
_file.set("Limit.WorldBlackList", limits.get("default").getWorldBlackList()); _file.setInlineComments("Limit.Size.MaxY", List.of(Translation.Config_Comment_SizeMaxY.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
_file.set("Limit.Size.MaxZ", groupLimits.get("default").getLimitSizeMaxZ(null));
_file.setInlineComments("Limit.Size.MaxZ", List.of(Translation.Config_Comment_SizeMaxZ.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
_file.set("Limit.Size.MinX", groupLimits.get("default").getLimitSizeMinX(null));
_file.setInlineComments("Limit.Size.MinX", List.of(Translation.Config_Comment_SizeMinX.trans()));
_file.set("Limit.Size.MinY", groupLimits.get("default").getLimitSizeMinY(null));
_file.setInlineComments("Limit.Size.MinY", List.of(Translation.Config_Comment_SizeMinY.trans()));
_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.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.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);
_file.setInlineComments("Teleport.Delay", List.of(Translation.Config_Comment_TpDelay.trans()));
_file.set("Teleport.CoolDown", _tp_cool_down); _file.set("Teleport.CoolDown", _tp_cool_down);
_file.setInlineComments("Teleport.CoolDown", List.of(Translation.Config_Comment_TpCoolDown.trans()));
_file.set("AutoCleanAfterDays", _auto_clean_after_days); _file.set("AutoCleanAfterDays", _auto_clean_after_days);
_file.setComments("AutoCleanAfterDays", Arrays.asList(Translation.Config_Comment_AutoCleanAfterDays.trans(), Translation.Config_Comment_NegativeOneDisabled.trans()));
_file.set("Tool", _tool); _file.set("Tool", _tool);
_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.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.set("Economy.OnlyXZ", limits.get("default").getPriceOnlyXZ()); _file.setInlineComments("Economy.Price", List.of(Translation.Config_Comment_Price.trans()));
_file.set("Economy.Refund", limits.get("default").getRefundRatio()); _file.set("Economy.OnlyXZ", groupLimits.get("default").getPriceOnlyXZ());
_file.setInlineComments("Economy.OnlyXZ", List.of(Translation.Config_Comment_OnlyXZ.trans()));
_file.set("Economy.Refund", groupLimits.get("default").getRefundRatio());
_file.setInlineComments("Economy.Refund", List.of(Translation.Config_Comment_Refund.trans()));
_file.set("FlyPermissionNodes", _fly_permission_nodes); _file.set("FlyPermissionNodes", _fly_permission_nodes);
_file.setComments("FlyPermissionNodes", List.of(Translation.Config_Comment_FlyPermission.trans()));
_file.set("ResidenceMigration", _residence_migration); _file.set("ResidenceMigration", _residence_migration);
_file.setComments("ResidenceMigration", List.of(Translation.Config_Comment_ResidenceMigration.trans()));
_file.setComments("GroupTitle", Arrays.asList(
Translation.Config_Comment_GroupTitle.trans(),
Translation.Config_Comment_GroupTitleVariable.trans(),
Translation.Config_Comment_GroupTitleColor.trans()));
_file.set("GroupTitle.Enable", _group_title_enable); _file.set("GroupTitle.Enable", _group_title_enable);
_file.set("GroupTitle.Prefix", _group_title_prefix); _file.set("GroupTitle.Prefix", _group_title_prefix);
_file.set("GroupTitle.Suffix", _group_title_suffix); _file.set("GroupTitle.Suffix", _group_title_suffix);
@ -184,6 +213,7 @@ public class ConfigManager {
_file.set("Debug", _debug); _file.set("Debug", _debug);
_file.set("Timer", _timer); _file.set("Timer", _timer);
_file.setInlineComments("Timer", List.of(Translation.Config_Comment_PerformanceTimer.trans()));
_plugin.saveConfig(); _plugin.saveConfig();
} }
@ -207,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;
} }
@ -228,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() {
@ -241,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() {
@ -300,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;
} }
@ -378,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;
} }
@ -391,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() {
@ -401,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() {
@ -411,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;
} }
@ -491,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;
@ -526,7 +508,11 @@ public class ConfigManager {
private String _db_pass; private String _db_pass;
private String _db_name; private String _db_name;
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;
@ -539,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;
@ -551,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("权限组 %s 的 MinY 不能大于等于 MaxY已重置为 -64 和 320", 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("权限组 %s 的 SizeX 设置过小,已重置为 128", 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("权限组 %s 的 SizeY 设置过小,已重置为 64", 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("权限组 %s 的 SizeZ 设置过小,已重置为 128", 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("权限组 %s 的 Amount 设置不合法,已重置为 10", 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("权限组 %s 的 Depth 设置不合法,已重置为 3", 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("权限组 %s 的 Price 设置不合法,已重置为 10.0", 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("权限组 %s 的 Refund 设置不合法,已重置为 0.85", 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();
@ -235,7 +290,105 @@ public class GroupLimit {
GroupLimit group = new GroupLimit(file); GroupLimit group = new GroupLimit(file);
groups.put(groupName, group); groups.put(groupName, group);
} }
XLogger.info("共加载了 %d 个领地组。", 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;
@ -18,7 +19,7 @@ public class PlaceHolderApi extends PlaceholderExpansion {
this.plugin = plugin; this.plugin = plugin;
this.register(); this.register();
instance = this; instance = this;
XLogger.info("成功注册 PlaceholderAPI 扩展"); XLogger.info(Translation.Messages_PlaceholderAPIRegisterSuccess);
} }
@Override @Override
@ -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; //
} }
@ -45,7 +53,7 @@ public class PlaceHolderApi extends PlaceholderExpansion {
@Override @Override
public @NotNull String getVersion() { public @NotNull String getVersion() {
return plugin.getPluginMeta().getVersion(); return plugin.getDescription().getVersion();
} }
} }

File diff suppressed because it is too large Load Diff

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,9 +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.tuis.dominion.DominionManage; import cn.lunadeer.dominion.managers.Translation;
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;
@ -33,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));
@ -44,8 +45,8 @@ public class CreateDominion {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
CuiTextInput.InputCallback createDominionCB = new createDominionCB(player); CuiTextInput.InputCallback createDominionCB = new createDominionCB(player);
CuiTextInput view = CuiTextInput.create(createDominionCB).setText("未命名领地").title("输入要创建的领地名称"); CuiTextInput view = CuiTextInput.create(createDominionCB).setText(Translation.Commands_NewDominionName.trans()).title(Translation.CUI_Input_CreateDominion.trans());
view.setSuggestCommand("/dominion auto_create <领地名称>"); view.setSuggestCommand(Translation.Commands_Dominion_AutoCreateDominionUsage.trans());
view.open(player); view.open(player);
} }
} }

View File

@ -1,9 +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.tuis.dominion.manage.group.GroupList; import cn.lunadeer.dominion.managers.Translation;
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;
@ -39,12 +40,12 @@ public class CreateGroup {
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, "领地不存在"); Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
return; return;
} }
CuiTextInput.InputCallback createGroupCB = new createGroupCB(player, dominion.getName()); CuiTextInput.InputCallback createGroupCB = new createGroupCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(createGroupCB).setText("未命名权限组").title("输入要创建的权限组名称"); CuiTextInput view = CuiTextInput.create(createGroupCB).setText(Translation.Commands_Group_NewGroupName.trans()).title(Translation.CUI_Input_CreateGroup.trans());
view.setSuggestCommand("/dominion group create <领地名称> <权限组名称>"); view.setSuggestCommand(Translation.Commands_Group_CreateGroupUsage.trans());
view.open(player); view.open(player);
} }

View File

@ -1,8 +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.tuis.template.TemplateList; import cn.lunadeer.dominion.managers.Translation;
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;
@ -32,8 +33,8 @@ public class CreateTemplate {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
CuiTextInput.InputCallback createTemplateCB = new createTemplateCB(player); CuiTextInput.InputCallback createTemplateCB = new createTemplateCB(player);
CuiTextInput view = CuiTextInput.create(createTemplateCB).setText("未命名模板").title("输入模板名称"); CuiTextInput view = CuiTextInput.create(createTemplateCB).setText(Translation.Commands_Template_NewTemplateName.trans()).title(Translation.CUI_Input_CreateTemplate.trans());
view.setSuggestCommand("/dominion template create <模板名称>"); view.setSuggestCommand(Translation.Commands_Template_CreateTemplateUsage.trans());
view.open(player); view.open(player);
} }

View File

@ -1,9 +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.tuis.dominion.DominionManage; import cn.lunadeer.dominion.managers.Translation;
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;
@ -37,12 +38,12 @@ public class EditJoinMessage {
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, "领地不存在"); Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
return; return;
} }
CuiTextInput.InputCallback editJoinMessageCB = new editJoinMessageCB(player, dominion.getName()); CuiTextInput.InputCallback editJoinMessageCB = new editJoinMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editJoinMessageCB).setText(dominion.getJoinMessage()).title("编辑欢迎提示语"); CuiTextInput view = CuiTextInput.create(editJoinMessageCB).setText(dominion.getJoinMessage()).title(Translation.CUI_Input_EditEnterMessage.trans());
view.setSuggestCommand("/dominion set_enter_msg <提示语> [领地名称]"); view.setSuggestCommand(Translation.Commands_Dominion_SetEnterMessageUsage.trans());
view.open(player); view.open(player);
} }
} }

View File

@ -1,9 +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.tuis.dominion.DominionManage; import cn.lunadeer.dominion.managers.Translation;
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;
@ -37,12 +38,12 @@ public class EditLeaveMessage {
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, "领地不存在"); Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
return; return;
} }
CuiTextInput.InputCallback editLeaveMessageCB = new editLeaveMessageCB(player, dominion.getName()); CuiTextInput.InputCallback editLeaveMessageCB = new editLeaveMessageCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(editLeaveMessageCB).setText(dominion.getLeaveMessage()).title("编辑离开提示语"); CuiTextInput view = CuiTextInput.create(editLeaveMessageCB).setText(dominion.getLeaveMessage()).title(Translation.CUI_Input_EditLeaveMessage.trans());
view.setSuggestCommand("/dominion set_leave_msg <提示语> [领地名称]"); view.setSuggestCommand(Translation.Commands_Dominion_SetLeaveMessageUsage.trans());
view.open(player); view.open(player);
} }
} }

View File

@ -1,11 +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.tuis.dominion.manage.member.MemberList; import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectPlayer; import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.MemberList;
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;
@ -47,12 +48,12 @@ public class MemberAdd {
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, "领地不存在"); Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
return; return;
} }
CuiTextInput.InputCallback createPrivilegeCB = new memberAddCB(player, dominion.getName()); CuiTextInput.InputCallback createPrivilegeCB = new memberAddCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title("输入玩家名称以添加为成员"); CuiTextInput view = CuiTextInput.create(createPrivilegeCB).setText("Steve").title(Translation.CUI_Input_AddMember.trans());
view.setSuggestCommand("/dominion member add <领地名称> <玩家名称>"); view.setSuggestCommand(Translation.Commands_Member_DominionAddMemberUsage.trans());
view.open(player); view.open(player);
} }

View File

@ -1,8 +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.tuis.dominion.DominionManage; import cn.lunadeer.dominion.managers.Translation;
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;
@ -34,8 +35,8 @@ public class RenameDominion {
Player player = playerOnly(sender); Player player = playerOnly(sender);
if (player == null) return; if (player == null) return;
CuiTextInput.InputCallback renameDominionCB = new renameDominionCB(player, args[1]); CuiTextInput.InputCallback renameDominionCB = new renameDominionCB(player, args[1]);
CuiTextInput view = CuiTextInput.create(renameDominionCB).setText(args[1]).title("领地重命名"); CuiTextInput view = CuiTextInput.create(renameDominionCB).setText(args[1]).title(Translation.CUI_Input_RenameDominion.trans());
view.setSuggestCommand("/dominion rename <原领地名称> <新领地名称>"); view.setSuggestCommand(Translation.Commands_Dominion_RenameDominionUsage.trans());
view.open(player); view.open(player);
} }
} }

View File

@ -1,9 +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.tuis.dominion.manage.group.GroupSetting; import cn.lunadeer.dominion.managers.Translation;
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;
@ -41,12 +42,12 @@ public class RenameGroup {
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, "领地不存在"); Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
return; return;
} }
CuiTextInput.InputCallback renameGroupCB = new renameGroupCB(player, dominion.getName(), args[2]); CuiTextInput.InputCallback renameGroupCB = new renameGroupCB(player, dominion.getName(), args[2]);
CuiTextInput view = CuiTextInput.create(renameGroupCB).setText(args[2]).title("输入新的权限组名称"); CuiTextInput view = CuiTextInput.create(renameGroupCB).setText(args[2]).title(Translation.CUI_Input_RenameGroup.trans());
view.setSuggestCommand("/dominion group rename <领地名称> <权限组旧名称> <新名称>"); view.setSuggestCommand(Translation.Commands_Group_RenameGroupUsage.trans());
view.open(player); view.open(player);
} }

View File

@ -1,9 +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.tuis.dominion.DominionManage; import cn.lunadeer.dominion.managers.Translation;
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;
@ -37,12 +38,12 @@ public class SetMapColor {
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, "领地不存在"); Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
return; return;
} }
CuiTextInput.InputCallback setMapColorCB = new SetMapColor.setMapColorCB(player, dominion.getName()); CuiTextInput.InputCallback setMapColorCB = new SetMapColor.setMapColorCB(player, dominion.getName());
CuiTextInput view = CuiTextInput.create(setMapColorCB).setText(dominion.getColor()).title("输入卫星地图地块颜色16进制"); CuiTextInput view = CuiTextInput.create(setMapColorCB).setText(dominion.getColor()).title(Translation.CUI_Input_SetMapColor.trans());
view.setSuggestCommand("/dominion set_map_color <颜色> [领地名称]"); view.setSuggestCommand(Translation.Commands_Dominion_SetMapColorUsage.trans());
view.open(player); view.open(player);
} }

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

@ -1,6 +1,7 @@
package cn.lunadeer.dominion.utils; package cn.lunadeer.dominion.utils;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
import cn.lunadeer.dominion.managers.Translation;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.minecraftpluginutils.Notification;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -12,7 +13,7 @@ import java.util.Map;
public class CommandUtils { public class CommandUtils {
public static Player playerOnly(CommandSender sender) { public static Player playerOnly(CommandSender sender) {
if (!(sender instanceof Player)) { if (!(sender instanceof Player)) {
Notification.error(sender, "该命令只能由玩家执行"); Notification.error(sender, Translation.Messages_CommandPlayerOnly);
return null; return null;
} }
return (Player) sender; return (Player) sender;
@ -20,7 +21,7 @@ public class CommandUtils {
public static boolean hasPermission(CommandSender sender, String permission) { public static boolean hasPermission(CommandSender sender, String permission) {
if (!sender.hasPermission(permission)) { if (!sender.hasPermission(permission)) {
Notification.error(sender, "你没有 %s 权限执行此命令", permission); Notification.error(sender, Translation.Messages_NoPermission, permission);
return false; return false;
} }
return true; return true;

View File

@ -6,6 +6,7 @@ import cn.lunadeer.dominion.controllers.AbstractOperator;
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.managers.Translation;
import org.bukkit.Location; import org.bukkit.Location;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@ -21,7 +22,7 @@ public class ControllerUtils {
if (!dominion.getOwner().equals(player.getUniqueId())) { if (!dominion.getOwner().equals(player.getUniqueId())) {
MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId()); MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId());
if (privileges == null || !privileges.getAdmin()) { if (privileges == null || !privileges.getAdmin()) {
player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你不是领地 %s 的拥有者或管理员,无权修改权限", dominion.getName())); player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_NotDominionOwnerOrAdmin, dominion.getName()));
return true; return true;
} }
} }
@ -38,7 +39,7 @@ public class ControllerUtils {
public static DominionDTO getPlayerCurrentDominion(AbstractOperator player) { public static DominionDTO getPlayerCurrentDominion(AbstractOperator player) {
Location location = player.getLocation(); Location location = player.getLocation();
if (location == null) { if (location == null) {
player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "无法获取你的位置信息")); player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_CannotGetDominionAuto));
return null; return null;
} }
DominionDTO dominion = Cache.instance.getDominionByLoc(location); DominionDTO dominion = Cache.instance.getDominionByLoc(location);
@ -48,7 +49,7 @@ public class ControllerUtils {
if (dominion.getParentDomId() == -1) { if (dominion.getParentDomId() == -1) {
return dominion; return dominion;
} else { } else {
player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, "你当前在子领地内,请指定要操作的领地名称")); player.setResponse(new AbstractOperator.Result(AbstractOperator.Result.FAILURE, Translation.Messages_InSubDominion));
return null; return null;
} }
} }

View File

@ -6,12 +6,7 @@ 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.dtos.MemberDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
import cn.lunadeer.minecraftpluginutils.Notification; import cn.lunadeer.dominion.managers.Translation;
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;
@ -76,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("你没有 %s (%s) 权限", 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

@ -3,9 +3,9 @@ package cn.lunadeer.dominion.utils;
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.MemberDTO; import cn.lunadeer.dominion.dtos.MemberDTO;
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;
@ -47,7 +47,7 @@ public class TuiUtils {
if (!dominion.getOwner().equals(player.getUniqueId())) { if (!dominion.getOwner().equals(player.getUniqueId())) {
MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId()); MemberDTO privileges = MemberDTO.select(player.getUniqueId(), dominion.getId());
if (privileges == null || !privileges.getAdmin()) { if (privileges == null || !privileges.getAdmin()) {
Notification.error(player, "你不是领地 %s 的拥有者或管理员,无权访问此页面", dominion.getName()); Notification.error(player, Translation.TUI_NotDominionOwnerOrAdminForPage, dominion.getName());
return true; return true;
} }
} }
@ -56,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;
@ -67,27 +67,9 @@ public class TuiUtils {
if (player == null) return; if (player == null) return;
int page = getPage(args, 1); int page = getPage(args, 1);
ListView view = ListView.create(10, "/dominion help"); ListView view = ListView.create(10, "/dominion help");
view.title("领地插件命令帮助 <>表示必填参数 []表示可选参数") view.title(Translation.TUI_CommandHelp_Title.trans())
.add(Line.create().append("打开交互菜单").append("/dominion menu")) .subtitle(Line.create().append(Translation.TUI_CommandHelp_SubTitle.trans()))
.add(Line.create().append("查看帮助").append("/dominion help [页码]")) // todo ...
.add(Line.create().append("创建领地").append("/dominion create <领地名称>"))
.add(Line.create().append("自动创建领地").append("/dominion auto_create <领地名称>"))
.add(Line.create().append("创建子领地").append("/dominion create_sub <子领地名称> [父领地名称]"))
.add(Line.create().append("自动创建子领地").append("/dominion auto_create_sub <子领地名称> [父领地名称]"))
.add(Line.create().append("管理领地").append("/dominion manage <领地名称>"))
.add(Line.create().append("扩张领地").append("/dominion expand [大小] [领地名称]"))
.add(Line.create().append("缩小领地").append("/dominion contract [大小] [领地名称]"))
.add(Line.create().append("设置进入领地的提示语").append("/dominion set_enter_msg <提示语> [领地名称]"))
.add(Line.create().append("设置离开领地的提示语").append("/dominion set_leave_msg <提示语> [领地名称]"))
.add(Line.create().append("设置领地传送点").append("/dominion set_tp_location [领地名称]"))
.add(Line.create().append("传送到领地").append("/dominion tp <领地名称>"))
.add(Line.create().append("重命名领地").append("/dominion rename <原领地名称> <新领地名称>"))
.add(Line.create().append("转让领地").append("/dominion give <领地名称> <玩家名称> [force]"))
.add(Line.create().append("删除领地").append("/dominion delete <领地名称> [force]"))
// 管理员指令
.add(Line.create().append("---[管理员指令]---"))
.add(Line.create().append("刷新缓存").append(Button.create("/dominion reload_cache").setExecuteCommand("/dominion reload_cache").build()))
.add(Line.create().append("重载配置").append(Button.create("/dominion reload_config").setExecuteCommand("/dominion reload_config").build()))
.showOn(player, page); .showOn(player, page);
} }

View File

@ -1,7 +1,9 @@
package cn.lunadeer.dominion.utils; 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.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import com.flowpowered.math.vector.Vector2d; import com.flowpowered.math.vector.Vector2d;
@ -20,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;
} }
@ -36,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));
@ -54,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)
@ -70,7 +78,7 @@ public class BlueMapConnect {
} }
}); });
} catch (NoClassDefFoundError e) { } catch (NoClassDefFoundError e) {
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); XLogger.warn(Translation.Messages_BlueMapConnectFailed);
XLogger.err(e.getMessage()); XLogger.err(e.getMessage());
} }
}); });
@ -123,7 +131,7 @@ public class BlueMapConnect {
} }
}); });
} catch (NoClassDefFoundError e) { } catch (NoClassDefFoundError e) {
XLogger.warn("无法连接 BlueMap 插件,如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能以避免下方的报错。"); XLogger.warn(Translation.Messages_BlueMapConnectFailed);
XLogger.err(e.getMessage()); XLogger.err(e.getMessage());
} }
}); });

View File

@ -1,6 +1,8 @@
package cn.lunadeer.dominion.utils; 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.minecraftpluginutils.Scheduler; import cn.lunadeer.minecraftpluginutils.Scheduler;
import cn.lunadeer.minecraftpluginutils.XLogger; import cn.lunadeer.minecraftpluginutils.XLogger;
import org.dynmap.DynmapCommonAPI; import org.dynmap.DynmapCommonAPI;
@ -29,17 +31,21 @@ public class DynmapConnect extends DynmapCommonAPIListener {
MarkerAPI markerAPI = dynmapCommonAPI.getMarkerAPI(); MarkerAPI markerAPI = dynmapCommonAPI.getMarkerAPI();
this.markerSet_dominion = markerAPI.getMarkerSet("dominion"); this.markerSet_dominion = markerAPI.getMarkerSet("dominion");
if (this.markerSet_dominion == null) { if (this.markerSet_dominion == null) {
this.markerSet_dominion = markerAPI.createMarkerSet("dominion", "Dominion领地", null, false); this.markerSet_dominion = markerAPI.createMarkerSet("dominion", "Dominion", null, false);
} }
this.markerSet_mca = markerAPI.getMarkerSet("mca"); this.markerSet_mca = markerAPI.getMarkerSet("mca");
if (this.markerSet_mca == null) { if (this.markerSet_mca == null) {
this.markerSet_mca = markerAPI.createMarkerSet("mca", "MCA文件", null, false); this.markerSet_mca = markerAPI.createMarkerSet("mca", "MCA文件", null, false);
} }
XLogger.info("Dynmap 成功注册"); XLogger.info(Translation.Messages_DynmapRegisterSuccess);
} }
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) {
@ -62,7 +68,7 @@ public class DynmapConnect extends DynmapCommonAPIListener {
public void setDominionMarkers(List<DominionDTO> dominions) { public void setDominionMarkers(List<DominionDTO> dominions) {
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
if (this.markerSet_dominion == null) { if (this.markerSet_dominion == null) {
XLogger.warn("无法连接到 Dynmap如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能。"); XLogger.warn(Translation.Messages_DynmapConnectFailed);
return; return;
} }
this.markerSet_dominion.getAreaMarkers().forEach(AreaMarker::deleteMarker); this.markerSet_dominion.getAreaMarkers().forEach(AreaMarker::deleteMarker);
@ -75,7 +81,7 @@ public class DynmapConnect extends DynmapCommonAPIListener {
public void setMCAMarkers(Map<String, List<String>> mca_files) { public void setMCAMarkers(Map<String, List<String>> mca_files) {
Scheduler.runTaskAsync(() -> { Scheduler.runTaskAsync(() -> {
if (this.markerSet_mca == null) { if (this.markerSet_mca == null) {
XLogger.warn("无法连接到 Dynmap如果你不打算使用卫星地图渲染建议前往配置文件关闭此功能。"); XLogger.warn(Translation.Messages_DynmapConnectFailed);
return; return;
} }
this.markerSet_mca.getAreaMarkers().forEach(AreaMarker::deleteMarker); this.markerSet_mca.getAreaMarkers().forEach(AreaMarker::deleteMarker);

View File

@ -1,4 +1,4 @@
package cn.lunadeer.dominion.utils; package cn.lunadeer.dominion.utils.map;
import cn.lunadeer.dominion.Cache; import cn.lunadeer.dominion.Cache;
import cn.lunadeer.dominion.Dominion; import cn.lunadeer.dominion.Dominion;
@ -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

@ -6,56 +6,69 @@ Database:
User: dominion User: dominion
Pass: dominion Pass: dominion
# 自动圈地大小 Language: zh-cn
AutoCreateRadius: 10 #-1 表示不开启
AutoCreateRadius: 10
DefaultJoinMessage: '&3{OWNER}: Welcome to {DOM}!'
DefaultLeaveMessage: '&3{OWNER}: Leaving {DOM}...'
MessageDisplay:
NoPermission: ACTION_BAR
JoinLeave: ACTION_BAR
Limit: Limit:
SpawnProtection: 10 # 出生点保护半径 出生点此范围内不允许圈地 -1 表示不开启 SpawnProtection: 10
MinY: -64 # 最小Y坐标 MinY: -64
MaxY: 320 # 最大Y坐标 MaxY: 320
SizeX: 128 # X方向最大长度 -1表示不限制 Size:
SizeY: 64 # Y方向最大长度 -1表示不限制 MaxX: 128
SizeZ: 128 # Z方向最大长度 -1表示不限制 MaxY: 64
Amount: 10 # 最大领地数量 -1表示不限制 MaxZ: 128
Depth: 3 # 子领地深度 0不允许子领地 -1不限制 MinX: 4
Vert: false # 是否自动延伸到 MaxY 和 MinY MinY: 4
WorldBlackList: [ ] # 不允许领地的世界 MinZ: 4
OpByPass: true # 是否允许OP无视领地限制 Amount: 10
Depth: 3
Vert: false
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
# 传送延迟 秒
Delay: 0 Delay: 0
# 冷却时间 秒
CoolDown: 0 CoolDown: 0
# 自动清理长时间未上线玩家的领地 AutoCleanAfterDays: 180
AutoCleanAfterDays: 180 # -1 表示不开启
# 圈地工具
Tool: ARROW Tool: ARROW
# 经济系统 - 需要安装Vault插件 InfoTool: STRING
Economy: Economy:
Enable: false Enable: false
# 单价 - 每方块
Price: 10.0 Price: 10.0
# 是否只计算xz平面积
OnlyXZ: false OnlyXZ: false
# 删除领地退还比例
Refund: 0.85 Refund: 0.85
# 飞行权限节点 - 拥有以下任意一个权限节点的玩家不会被本插件拦截飞行
FlyPermissionNodes: FlyPermissionNodes:
- essentials.fly - essentials.fly
- cmi.command.fly - cmi.command.fly
# 是否允许玩家从 Residence 迁移领地数据
ResidenceMigration: false ResidenceMigration: false
# 权限组称号 - 使用权限组当作称号(需要PlaceholderAPI插件)
# Papi: %dominion_group_title%
# 前后缀如需要加颜色请使用这种格式 &#ffffff
GroupTitle: GroupTitle:
Enable: false Enable: false
Prefix: "[" Prefix: "["
@ -68,4 +81,4 @@ CheckUpdate: true
Debug: false Debug: false
Timer: false # 性能测试计时器 Timer: false

View File

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 之类的。

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