mirror of
https://github.com/ColdeZhang/Dominion.git
synced 2024-10-18 21:16:45 +08:00
Compare commits
115 Commits
v2.5.2-bet
...
master
Author | SHA1 | Date | |
---|---|---|---|
11123822e4 | |||
3f6b7c8a92 | |||
3b09e6c885 | |||
2d2fb9a233 | |||
8e490ec57a | |||
f1116fa281 | |||
dcf39f4097 | |||
76a9b27ebd | |||
1b48eba6c7 | |||
01b329a3e7 | |||
7fff24dacf | |||
8e251504fa | |||
5732fe0182 | |||
a53733a0fb | |||
5734c97a58 | |||
a86ce4624f | |||
6f4d716d95 | |||
9017402d06 | |||
af7c4ad6b2 | |||
6e57cada94 | |||
d287b611ad | |||
7046ef0391 | |||
9eb69a4ecc | |||
7f4ed745d7 | |||
7bf81b753d | |||
086e468f03 | |||
e0e713c097 | |||
be496aac0d | |||
ed6dc7c878 | |||
|
901be9f9af | ||
897c6f17fd | |||
ab838c5596 | |||
1b2e193280 | |||
d58b343b7c | |||
c132f52f99 | |||
5cc0750ee9 | |||
458fc530df | |||
ca2b42a84d | |||
a350e01e4b | |||
5bdd15f442 | |||
bc2c66bdd9 | |||
e8271927ea | |||
ab0f2a95dd | |||
6789828dec | |||
0611600a72 | |||
|
38c780302d | ||
8dc6190f57 | |||
|
6ed1f2eaf5 | ||
ff23753c62 | |||
72a5a84a65 | |||
99405c3828 | |||
3a08f41906 | |||
b818fc2153 | |||
bac6f90196 | |||
b6f0d8f8ef | |||
9f788ae26d | |||
e12dd87173 | |||
618b5c1810 | |||
66af44e789 | |||
dbbcf45266 | |||
b82e6d2364 | |||
278de184ae | |||
268d17bd4f | |||
e126a2629e | |||
1ba7de75cb | |||
9113d3a043 | |||
a12775e0ff | |||
f9a5535c3f | |||
ea8c171858 | |||
5d890bc957 | |||
864bb65376 | |||
4effb8a829 | |||
555bb68af3 | |||
0a8e1935be | |||
bb5d95a6f8 | |||
d39d1981f2 | |||
59668604c1 | |||
c3a2b5db13 | |||
35ed249fbb | |||
cb24f91208 | |||
456859b645 | |||
57bc5ada44 | |||
a0f7ba8a45 | |||
4a1aecf31a | |||
d6bb84d777 | |||
ac995b5c62 | |||
1f824bc0b9 | |||
a41e245f5e | |||
e995af24fd | |||
c541a63ee0 | |||
48d8742bec | |||
e52b4426e7 | |||
3a9fcc89ad | |||
9a402199d1 | |||
e90f7f674c | |||
e158066d88 | |||
18632f9094 | |||
04c3036f2c | |||
989cad0dd8 | |||
40d4ede3fc | |||
1f3fb77b49 | |||
83a2daaaed | |||
16728cce6d | |||
f2c04df403 | |||
ec66ca545a | |||
592ade9c23 | |||
cdb8431a96 | |||
bb832fcfc8 | |||
5821285036 | |||
71ff9a6131 | |||
5cb157d7b3 | |||
c1ecaec48b | |||
4c5f3a6db1 | |||
63b1c31953 | |||
b70cfd236a |
@ -13,6 +13,12 @@ jobs:
|
||||
uses: https://ssl.lunadeer.cn:14446/actions/checkout@v3
|
||||
with:
|
||||
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"
|
||||
uses: https://ssl.lunadeer.cn:14446/actions/setup-java@v3
|
||||
with:
|
||||
@ -21,9 +27,13 @@ jobs:
|
||||
cache: gradle
|
||||
- name: "Build with Gradle"
|
||||
run: |
|
||||
./gradlew buildPlugin
|
||||
- name: "Copy jar to staging"
|
||||
run: mkdir staging && cp build/libs/*.jar staging/
|
||||
./gradlew clean
|
||||
./gradlew shadowJar -PBuildFull=false
|
||||
./gradlew shadowJar -PBuildFull=true
|
||||
- name: "Stage"
|
||||
run: |
|
||||
mkdir -p staging
|
||||
mv build/libs/*.jar staging/
|
||||
- name: "Build & test"
|
||||
run: |
|
||||
echo "done!"
|
||||
@ -36,7 +46,7 @@ jobs:
|
||||
- name: "Release"
|
||||
uses: https://ssl.lunadeer.cn:14446/zhangyuheng/release-action@main
|
||||
with:
|
||||
note: " - 带 `original-` 前缀的文件无法用于运行,请下载不带此前缀的版本。"
|
||||
note: " - `full` 后缀包含所有依赖直接安装即可使用,`lite` 后缀不包含任何依赖,会在第一次安装后启动时自动下载"
|
||||
files: |-
|
||||
staging/*.jar
|
||||
api_key: '${{secrets.RELEASE_TOKEN}}'
|
8
.github/ISSUE_TEMPLATE/报告bug.md
vendored
8
.github/ISSUE_TEMPLATE/报告bug.md
vendored
@ -15,10 +15,9 @@ assignees: ''
|
||||
|
||||
Bug复现步骤:
|
||||
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
1. 打开冰箱;
|
||||
2. 将大象放入冰箱;
|
||||
3. 关上冰箱。
|
||||
|
||||
**正常情况的表现**
|
||||
|
||||
@ -33,6 +32,7 @@ Bug复现步骤:
|
||||
- 服务器系统:win, linux
|
||||
- 服务端核心:(如:Paper、Spigot)
|
||||
- 服务端版本:
|
||||
- 客户端版本:
|
||||
- 插件版本:
|
||||
|
||||
**补充信息**
|
||||
|
21
.github/workflows/check.yml
vendored
Normal file
21
.github/workflows/check.yml
vendored
Normal 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!"
|
37
.github/workflows/main.yml
vendored
37
.github/workflows/main.yml
vendored
@ -12,24 +12,51 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up JDK 21
|
||||
- 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: "Copy jar to staging"
|
||||
run: mkdir staging && cp build/libs/*.jar staging/
|
||||
run: |
|
||||
./gradlew clean
|
||||
./gradlew shadowJar -PBuildFull=false
|
||||
./gradlew shadowJar -PBuildFull=true
|
||||
- name: "Stage"
|
||||
run: |
|
||||
mkdir -p staging
|
||||
mv build/libs/*.jar staging/
|
||||
- name: "Build & test"
|
||||
run: |
|
||||
TAG=$(echo $GITHUB_REF | sed 's/refs\/tags\///')
|
||||
echo "done!"
|
||||
- uses: "marvinpinto/action-automatic-releases@latest"
|
||||
- name: "GitHub Release"
|
||||
uses: "marvinpinto/action-automatic-releases@latest"
|
||||
with:
|
||||
repo_token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
automatic_release_tag: "${{ steps.build.outputs.TAG }}"
|
||||
prerelease: false
|
||||
files: |
|
||||
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
55
.github/workflows/wiki.yml
vendored
Normal 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
1
.gitignore
vendored
@ -111,3 +111,4 @@ buildNumber.properties
|
||||
|
||||
# Common working directory
|
||||
run/
|
||||
/docs/_book/
|
||||
|
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "api"]
|
||||
path = api
|
||||
url = https://github.com/ColdeZhang/DominionAPI.git
|
65
CONTRIBUTING.md
Normal file
65
CONTRIBUTING.md
Normal 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 ❤!
|
57
README.md
57
README.md
@ -1,50 +1,55 @@
|
||||
<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%">
|
||||
|
||||
|
||||
[![GitHub Repository](https://img.shields.io/badge/GitHub-开源地址-blue?logo=github)](https://github.com/ColdeZhang/Dominion)
|
||||
[![Documentation](https://img.shields.io/badge/Document-Online-70f3ff?logo=readthedocs)](https://dominion.lunadeer.cn/)
|
||||
[![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/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=%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)
|
||||
[![Latest Build](https://img.shields.io/github/v/release/ColdeZhang/Dominion?label=LatestBuild&logo=github&color=0aa344)](https://github.com/ColdeZhang/Dominion/releases/latest)
|
||||
|
||||
[![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>
|
||||
|
||||
---
|
||||
|
||||
## 简介
|
||||
[中文(简体)](README_zh.md) | English
|
||||
|
||||
鉴于 Residence 插件的作者项目较多,维护压力大,无法及时跟进新版本以及适配Folia核心。故开发此插件,旨在平替纯净版生存服Residence的使用(支持从
|
||||
Res 迁移数据)。
|
||||
## What's this?
|
||||
|
||||
**请注意,本插件目前处于中期测试稳定阶段,绝大多数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.
|
||||
|
||||
## 功能介绍
|
||||
<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>
|
||||
For detail functions and features of Dominion, you can view [Introduction](intro/intro_en-us.md)
|
||||
|
||||
## 支持版本
|
||||
## Version Support
|
||||
|
||||
- 1.20.1+ (Bukkit、Spigot、Paper、Folia)
|
||||
|
||||
> 需要使用 Java21 运行你的服务端,如果你还在使用 Java17 可以放心替换为 Java21,理论上 1.20.1+ 版本的服务端核心可以直接升级到
|
||||
> Java21 启动。
|
||||
> Although this plugin supports Spigot, we strongly recommend that you upgrade your core to Paper or its forked (such as
|
||||
> 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">
|
||||
<img src="https://bstats.org/signatures/bukkit/Dominion.svg" alt="" width="100%">
|
||||
|
61
README_zh.md
Normal file
61
README_zh.md
Normal 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
1
api
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 9a22a3e453ef0391741b6282a5b7f7219bfbbb0c
|
@ -1,13 +1,20 @@
|
||||
import io.papermc.hangarpublishplugin.model.Platforms
|
||||
|
||||
plugins {
|
||||
id("java")
|
||||
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"
|
||||
version = "2.5.2-beta"
|
||||
version = "2.14.1-beta"
|
||||
|
||||
java {
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// utf-8
|
||||
@ -26,7 +33,6 @@ allprojects {
|
||||
maven("https://repo.papermc.io/repository/maven-public/")
|
||||
maven("https://jitpack.io")
|
||||
maven("https://repo.mikeprimm.com/")
|
||||
maven("https://ssl.lunadeer.cn:14454/repository/maven-snapshots/")
|
||||
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
|
||||
}
|
||||
|
||||
@ -35,17 +41,37 @@ allprojects {
|
||||
compileOnly("us.dynmap:DynmapCoreAPI:3.4")
|
||||
compileOnly("me.clip:placeholderapi:2.11.6")
|
||||
|
||||
implementation("cn.lunadeer:MinecraftPluginUtils:1.3.8-SNAPSHOT")
|
||||
implementation("org.yaml:snakeyaml:2.0")
|
||||
if (!BuildFull) {
|
||||
libraries.forEach {
|
||||
compileOnly(it)
|
||||
}
|
||||
} else {
|
||||
libraries.forEach {
|
||||
implementation(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.processResources {
|
||||
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
|
||||
filesMatching("**/plugin.yml") {
|
||||
filter {
|
||||
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("")
|
||||
archiveVersion.set(project.version.toString())
|
||||
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())
|
||||
}
|
||||
|
||||
tasks.register("buildPlugin") { // <<<< RUN THIS TASK TO BUILD PLUGIN
|
||||
tasks.register("Clean&Build") { // <<<< RUN THIS TASK TO BUILD PLUGIN
|
||||
dependsOn(tasks.clean)
|
||||
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"))
|
||||
}
|
@ -3,7 +3,7 @@ plugins {
|
||||
}
|
||||
|
||||
java {
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
|
||||
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
|
||||
// utf-8
|
||||
@ -12,5 +12,6 @@ tasks.withType<JavaCompile> {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(project(":api"))
|
||||
compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT")
|
||||
}
|
||||
|
@ -1,11 +1,12 @@
|
||||
package cn.lunadeer.dominion;
|
||||
|
||||
import cn.lunadeer.dominion.api.DominionAPI;
|
||||
import cn.lunadeer.dominion.dtos.*;
|
||||
import cn.lunadeer.dominion.utils.map.MapRender;
|
||||
import cn.lunadeer.dominion.utils.MessageDisplay;
|
||||
import cn.lunadeer.dominion.utils.Particle;
|
||||
import cn.lunadeer.dominion.utils.ResMigration;
|
||||
import cn.lunadeer.dominion.utils.map.MapRender;
|
||||
import cn.lunadeer.minecraftpluginutils.AutoTimer;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.Scheduler;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import org.bukkit.GameMode;
|
||||
@ -205,16 +206,7 @@ public class Cache {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取玩家当前所在领地
|
||||
* 此方法会先判断缓存中是否有玩家当前所在领地,如果没有则遍历所有领地判断玩家所在位置
|
||||
* 如果玩家不在任何领地内,则返回null
|
||||
* 如果玩家在领地内,则返回领地信息
|
||||
*
|
||||
* @param player 玩家
|
||||
* @return 玩家当前所在领地
|
||||
*/
|
||||
public DominionDTO getPlayerCurrentDominion(Player player) {
|
||||
public DominionDTO getPlayerCurrentDominion(@NotNull Player player) {
|
||||
try (AutoTimer ignored = new AutoTimer(Dominion.config.TimerEnabled())) {
|
||||
Integer last_in_dom_id = player_current_dominion_id.get(player.getUniqueId());
|
||||
DominionDTO last_dominion = null;
|
||||
@ -239,14 +231,18 @@ public class Cache {
|
||||
return last_dominion;
|
||||
}
|
||||
if (last_dom_id != -1) {
|
||||
String msg = last_dominion.getLeaveMessage();
|
||||
msg = msg.replace("${DOM_NAME}", last_dominion.getName());
|
||||
Notification.actionBar(player, msg);
|
||||
MessageDisplay.show(player, Dominion.config.getMessageDisplayJoinLeave(),
|
||||
last_dominion.getLeaveMessage()
|
||||
.replace("{DOM}", last_dominion.getName())
|
||||
.replace("{OWNER}", getPlayerName(last_dominion.getOwner()))
|
||||
);
|
||||
}
|
||||
if (current_dom_id != -1) {
|
||||
String msg = current_dominion.getJoinMessage();
|
||||
msg = msg.replace("${DOM_NAME}", current_dominion.getName());
|
||||
Notification.actionBar(player, msg);
|
||||
MessageDisplay.show(player, Dominion.config.getMessageDisplayJoinLeave(),
|
||||
current_dominion.getJoinMessage()
|
||||
.replace("{DOM}", current_dominion.getName())
|
||||
.replace("{OWNER}", getPlayerName(current_dominion.getOwner()))
|
||||
);
|
||||
}
|
||||
|
||||
lightOrNot(player, current_dominion); // 发光检查
|
||||
@ -264,6 +260,10 @@ public class Cache {
|
||||
}
|
||||
}
|
||||
|
||||
public DominionDTO getDominionByLoc(@NotNull Location loc) {
|
||||
return dominion_trees.getLocInDominionDTO(loc);
|
||||
}
|
||||
|
||||
/**
|
||||
* 玩家退出时调用 用于清除玩家当前所在领地
|
||||
* 会将玩家当前所在领地设置为null
|
||||
@ -343,28 +343,16 @@ public class Cache {
|
||||
}
|
||||
}
|
||||
|
||||
public DominionDTO getDominionByLoc(Location loc) {
|
||||
return dominion_trees.getLocInDominionDTO(loc);
|
||||
}
|
||||
|
||||
public GroupDTO getGroup(Integer id) {
|
||||
public GroupDTO getGroup(@NotNull Integer id) {
|
||||
return id_groups.get(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取玩家在指定领地的特权
|
||||
* 如果玩家不存在特权,则返回null
|
||||
*
|
||||
* @param player 玩家
|
||||
* @param dominion 领地
|
||||
* @return 特权表
|
||||
*/
|
||||
public MemberDTO getMember(Player player, DominionDTO dominion) {
|
||||
public MemberDTO getMember(@NotNull Player player, cn.lunadeer.dominion.api.dtos.@NotNull DominionDTO dominion) {
|
||||
if (!player_uuid_to_member.containsKey(player.getUniqueId())) return null;
|
||||
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;
|
||||
return player_uuid_to_member.get(player_uuid).get(dominion.getId());
|
||||
}
|
||||
@ -383,10 +371,20 @@ public class Cache {
|
||||
return groups;
|
||||
}
|
||||
|
||||
public DominionDTO getDominion(Integer id) {
|
||||
public DominionDTO getDominion(@NotNull Integer 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) {
|
||||
int count = 0;
|
||||
for (DominionDTO dominion : id_dominions.values()) {
|
||||
@ -416,7 +414,7 @@ public class Cache {
|
||||
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());
|
||||
}
|
||||
|
||||
@ -452,6 +450,7 @@ public class Cache {
|
||||
private static final long UPDATE_INTERVAL = 1000 * 4;
|
||||
private boolean recheckPlayerState = false; // 是否需要重新检查玩家状态(发光、飞行)
|
||||
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;
|
||||
|
||||
@ -595,7 +594,7 @@ public class Cache {
|
||||
}
|
||||
}
|
||||
|
||||
public @Nullable GroupDTO getPlayerUsingGroupTitle(UUID uuid) {
|
||||
public @Nullable GroupDTO getPlayerUsingGroupTitle(@NotNull UUID uuid) {
|
||||
if (!Dominion.config.getGroupTitleEnable()) {
|
||||
return null;
|
||||
}
|
||||
|
@ -2,15 +2,18 @@ package cn.lunadeer.dominion;
|
||||
|
||||
import cn.lunadeer.dominion.commands.*;
|
||||
import cn.lunadeer.dominion.controllers.PlayerController;
|
||||
import cn.lunadeer.dominion.cuis.*;
|
||||
import cn.lunadeer.dominion.dtos.PlayerDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.*;
|
||||
import cn.lunadeer.dominion.tuis.dominion.DominionList;
|
||||
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.GuestSetting;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.SizeInfo;
|
||||
import cn.lunadeer.dominion.uis.cuis.*;
|
||||
import cn.lunadeer.dominion.uis.tuis.AllDominion;
|
||||
import cn.lunadeer.dominion.uis.tuis.Menu;
|
||||
import cn.lunadeer.dominion.uis.tuis.MigrateList;
|
||||
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 org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@ -115,12 +118,15 @@ public class Commands implements TabExecutor {
|
||||
case "export_mca":
|
||||
Operator.exportMca(sender, args);
|
||||
break;
|
||||
case "sys_config":
|
||||
SysConfig.show(sender, args);
|
||||
case "export_db":
|
||||
Operator.exportDatabase(sender, args);
|
||||
break;
|
||||
case "set_config":
|
||||
SetConfig.handler(sender, args);
|
||||
case "import_db":
|
||||
Operator.importDatabase(sender, args);
|
||||
break;
|
||||
// case "set_config":
|
||||
// SetConfig.handler(sender, args);
|
||||
// break;
|
||||
case "all_dominion":
|
||||
AllDominion.show(sender, args);
|
||||
break;
|
||||
@ -216,6 +222,9 @@ public class Commands implements TabExecutor {
|
||||
"reload_cache",
|
||||
"reload_config",
|
||||
"export_mca",
|
||||
"export_db",
|
||||
"import_db",
|
||||
"version",
|
||||
"sys_config",
|
||||
"all_dominion",
|
||||
"set_map_color",
|
||||
|
@ -39,15 +39,15 @@ public final class Dominion extends JavaPlugin {
|
||||
new Scheduler(this);
|
||||
AutoClean.run();
|
||||
Cache.instance = new Cache();
|
||||
DominionInterface.instance = new DominionInterface();
|
||||
|
||||
if (config.getGroupTitleEnable()) {
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
new PlaceHolderApi(this);
|
||||
} else {
|
||||
}
|
||||
if (config.getGroupTitleEnable() && !Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
XLogger.warn(Translation.Messages_PlaceholderAPINotFound);
|
||||
config.setGroupTitleEnable(false);
|
||||
}
|
||||
}
|
||||
|
||||
new EventsRegister(this);
|
||||
Objects.requireNonNull(Bukkit.getPluginCommand("dominion")).setExecutor(new Commands());
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
package cn.lunadeer.dominion;
|
||||
|
||||
import cn.lunadeer.minecraftpluginutils.Common;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import org.bukkit.Bukkit;
|
||||
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.EnvironmentEvents");
|
||||
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;
|
||||
case v1_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.EnvironmentEvents");
|
||||
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;
|
||||
}
|
||||
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
|
||||
|
@ -4,8 +4,8 @@ import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.FlagsController;
|
||||
import cn.lunadeer.dominion.dtos.Flag;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.EnvSetting;
|
||||
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 org.bukkit.command.CommandSender;
|
||||
|
||||
|
@ -3,9 +3,9 @@ package cn.lunadeer.dominion.commands;
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.GroupController;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupList;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupSetting;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.group.SelectMember;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupList;
|
||||
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.Notification;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
@ -44,7 +44,7 @@ public class Helper {
|
||||
if (dominion == null) return groups_name;
|
||||
List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId());
|
||||
for (GroupDTO group : groups) {
|
||||
groups_name.add(group.getName());
|
||||
groups_name.add(group.getNamePlain());
|
||||
}
|
||||
return groups_name;
|
||||
}
|
||||
|
@ -3,10 +3,10 @@ package cn.lunadeer.dominion.commands;
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.MemberController;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberList;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberSetting;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectPlayer;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.member.SelectTemplate;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.MemberList;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.manage.member.MemberSetting;
|
||||
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 org.bukkit.command.CommandSender;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
@ -6,7 +6,7 @@ import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.DominionController;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.MigrateList;
|
||||
import cn.lunadeer.dominion.uis.tuis.MigrateList;
|
||||
import cn.lunadeer.dominion.utils.ResMigration;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
@ -2,7 +2,8 @@ package cn.lunadeer.dominion.commands;
|
||||
|
||||
import cn.lunadeer.dominion.Cache;
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.api.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.DatabaseTables;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.utils.map.MapRender;
|
||||
import cn.lunadeer.minecraftpluginutils.GiteaReleaseCheck;
|
||||
@ -52,7 +53,7 @@ public class Operator {
|
||||
Scheduler.runTaskAsync(() -> {
|
||||
Notification.info(sender, Translation.Commands_Operator_ExportingMCAList);
|
||||
Map<String, List<String>> mca_cords = new HashMap<>();
|
||||
List<DominionDTO> doms = Cache.instance.getDominions();
|
||||
List<DominionDTO> doms = Cache.instance.getAllDominions();
|
||||
for (DominionDTO dom : doms) {
|
||||
if (dom.getWorld() == null) {
|
||||
continue;
|
||||
@ -140,6 +141,42 @@ public class Operator {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出数据库
|
||||
* /dominion export_db [confirm]
|
||||
*
|
||||
* @param sender 发送者
|
||||
* @param args 参数
|
||||
*/
|
||||
public static void exportDatabase(CommandSender sender, String[] args) {
|
||||
if (!hasPermission(sender, "dominion.admin")) {
|
||||
return;
|
||||
}
|
||||
if (args.length != 2 || !args[1].equals("confirm")) {
|
||||
Notification.warn(sender, Translation.Commands_Operator_ExportDBConfirm);
|
||||
return;
|
||||
}
|
||||
DatabaseTables.Export(sender);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入数据库
|
||||
* /dominion import_db [confirm]
|
||||
*
|
||||
* @param sender 发送者
|
||||
* @param args 参数
|
||||
*/
|
||||
public static void importDatabase(CommandSender sender, String[] args) {
|
||||
if (!hasPermission(sender, "dominion.admin")) {
|
||||
return;
|
||||
}
|
||||
if (args.length != 2 || !args[1].equals("confirm")) {
|
||||
Notification.warn(sender, Translation.Commands_Operator_ImportDBConfirm);
|
||||
return;
|
||||
}
|
||||
DatabaseTables.Import(sender);
|
||||
}
|
||||
|
||||
public static void version(CommandSender sender, String[] args) {
|
||||
if (!hasPermission(sender, "dominion.admin")) {
|
||||
return;
|
||||
|
@ -1,280 +0,0 @@
|
||||
package cn.lunadeer.dominion.commands;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.SysConfig;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import static cn.lunadeer.dominion.utils.CommandUtils.hasPermission;
|
||||
|
||||
public class SetConfig {
|
||||
|
||||
public static void handler(CommandSender sender, String[] args) {
|
||||
if (!hasPermission(sender, "dominion.admin")) {
|
||||
return;
|
||||
}
|
||||
if (args.length < 2) {
|
||||
Notification.error(sender, Translation.Commands_ArgumentsNotEnough);
|
||||
return;
|
||||
}
|
||||
switch (args[1]) {
|
||||
case "auto_create_radius":
|
||||
setAutoCreateRadius(sender, args);
|
||||
break;
|
||||
case "limit_max_y":
|
||||
setLimitMaxY(sender, args);
|
||||
break;
|
||||
case "limit_min_y":
|
||||
setLimitMinY(sender, args);
|
||||
break;
|
||||
case "limit_size_x":
|
||||
setLimitSizeX(sender, args);
|
||||
break;
|
||||
case "limit_size_z":
|
||||
setLimitSizeZ(sender, args);
|
||||
break;
|
||||
case "limit_size_y":
|
||||
setLimitSizeY(sender, args);
|
||||
break;
|
||||
case "limit_amount":
|
||||
setLimitAmount(sender, args);
|
||||
break;
|
||||
case "limit_depth":
|
||||
setLimitDepth(sender, args);
|
||||
break;
|
||||
case "limit_vert":
|
||||
setLimitVert(sender, args);
|
||||
break;
|
||||
case "limit_op_bypass":
|
||||
setLimitOpBypass(sender, args);
|
||||
break;
|
||||
case "tp_enable":
|
||||
setTpEnable(sender, args);
|
||||
break;
|
||||
case "tp_delay":
|
||||
setTpDelay(sender, args);
|
||||
break;
|
||||
case "tp_cool_down":
|
||||
setTpCoolDown(sender, args);
|
||||
break;
|
||||
case "economy_enable":
|
||||
setEconomyEnable(sender, args);
|
||||
break;
|
||||
case "economy_price":
|
||||
setEconomyPrice(sender, args);
|
||||
break;
|
||||
case "economy_only_xz":
|
||||
setEconomyOnlyXZ(sender, args);
|
||||
break;
|
||||
case "economy_refund":
|
||||
setEconomyRefund(sender, args);
|
||||
break;
|
||||
case "residence_migration":
|
||||
setResidenceMigration(sender, args);
|
||||
break;
|
||||
case "spawn_protection":
|
||||
setSpawnProtection(sender, args);
|
||||
break;
|
||||
default:
|
||||
Notification.error(sender, Translation.Commands_UnknownArgument);
|
||||
}
|
||||
}
|
||||
|
||||
public static void refreshPageOrNot(CommandSender sender, String[] args) {
|
||||
if (args.length == 4) {
|
||||
int page = Integer.parseInt(args[3]);
|
||||
String[] newArgs = new String[2];
|
||||
newArgs[0] = "config";
|
||||
newArgs[1] = String.valueOf(page);
|
||||
SysConfig.show(sender, newArgs);
|
||||
}
|
||||
}
|
||||
|
||||
private static void setAutoCreateRadius(CommandSender sender, String[] args) {
|
||||
int size = Integer.parseInt(args[2]);
|
||||
if (size <= 0) {
|
||||
Dominion.config.setAutoCreateRadius(1);
|
||||
Notification.error(sender, Translation.Config_Check_AutoCreateRadiusError);
|
||||
} else {
|
||||
Dominion.config.setAutoCreateRadius(size);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void adjustSizeY() {
|
||||
if (Dominion.config.getLimitVert(null)) {
|
||||
Dominion.config.setLimitSizeY(Dominion.config.getLimitMaxY(null) - Dominion.config.getLimitMinY(null) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
private static void setLimitMaxY(CommandSender sender, String[] args) {
|
||||
int maxY = Integer.parseInt(args[2]);
|
||||
if (maxY <= Dominion.config.getLimitMinY(null)) {
|
||||
Notification.error(sender, Translation.Commands_SetConfig_MinYShouldBeLessThanMaxY);
|
||||
return;
|
||||
}
|
||||
Dominion.config.setLimitMaxY(maxY);
|
||||
adjustSizeY();
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setLimitMinY(CommandSender sender, String[] args) {
|
||||
int minY = Integer.parseInt(args[2]);
|
||||
if (minY >= Dominion.config.getLimitMaxY(null)) {
|
||||
Notification.error(sender, Translation.Commands_SetConfig_MaxYShouldBeGreaterThanMinY);
|
||||
return;
|
||||
}
|
||||
Dominion.config.setLimitMinY(minY);
|
||||
adjustSizeY();
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setLimitSizeX(CommandSender sender, String[] args) {
|
||||
int sizeX = Integer.parseInt(args[2]);
|
||||
if (sizeX != -1 && sizeX < 4) {
|
||||
Dominion.config.setLimitSizeX(4);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_SizeXShouldBeGreaterThan4);
|
||||
} else {
|
||||
Dominion.config.setLimitSizeX(sizeX);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setLimitSizeZ(CommandSender sender, String[] args) {
|
||||
int sizeZ = Integer.parseInt(args[2]);
|
||||
if (sizeZ != -1 && sizeZ < 4) {
|
||||
Dominion.config.setLimitSizeZ(4);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_SizeZShouldBeGreaterThan4);
|
||||
return;
|
||||
} else {
|
||||
Dominion.config.setLimitSizeZ(sizeZ);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setLimitSizeY(CommandSender sender, String[] args) {
|
||||
int sizeY = Integer.parseInt(args[2]);
|
||||
if (sizeY != -1 && sizeY < 4) {
|
||||
Dominion.config.setLimitSizeY(4);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_SizeYShouldBeGreaterThan4);
|
||||
} else {
|
||||
Dominion.config.setLimitSizeY(sizeY);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setLimitAmount(CommandSender sender, String[] args) {
|
||||
int amount = Integer.parseInt(args[2]);
|
||||
if (amount != -1 && amount < 0) {
|
||||
Dominion.config.setLimitAmount(0);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_AmountShouldBeGreaterThan0);
|
||||
} else {
|
||||
Dominion.config.setLimitAmount(amount);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setLimitDepth(CommandSender sender, String[] args) {
|
||||
int depth = Integer.parseInt(args[2]);
|
||||
if (depth != -1 && depth < 0) {
|
||||
Dominion.config.setLimitDepth(0);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_DepthShouldBeGreaterThan0);
|
||||
} else {
|
||||
Dominion.config.setLimitDepth(depth);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setLimitVert(CommandSender sender, String[] args) {
|
||||
boolean limitVert = Boolean.parseBoolean(args[2]);
|
||||
Dominion.config.setLimitVert(limitVert);
|
||||
adjustSizeY();
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setLimitOpBypass(CommandSender sender, String[] args) {
|
||||
boolean limitOpBypass = Boolean.parseBoolean(args[2]);
|
||||
Dominion.config.setLimitOpBypass(limitOpBypass);
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setTpEnable(CommandSender sender, String[] args) {
|
||||
boolean tpEnable = Boolean.parseBoolean(args[2]);
|
||||
Dominion.config.setTpEnable(tpEnable);
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setTpDelay(CommandSender sender, String[] args) {
|
||||
int tpDelay = Integer.parseInt(args[2]);
|
||||
if (tpDelay < 0) {
|
||||
Dominion.config.setTpDelay(0);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_TpDelayShouldBeGreaterThan0);
|
||||
} else {
|
||||
Dominion.config.setTpDelay(tpDelay);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setTpCoolDown(CommandSender sender, String[] args) {
|
||||
int tpCoolDown = Integer.parseInt(args[2]);
|
||||
if (tpCoolDown < 0) {
|
||||
Dominion.config.setTpCoolDown(0);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_TpCoolDownShouldBeGreaterThan0);
|
||||
} else {
|
||||
Dominion.config.setTpCoolDown(tpCoolDown);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setEconomyEnable(CommandSender sender, String[] args) {
|
||||
boolean economyEnable = Boolean.parseBoolean(args[2]);
|
||||
Dominion.config.setEconomyEnable(economyEnable);
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setEconomyPrice(CommandSender sender, String[] args) {
|
||||
float economyPrice = Float.parseFloat(args[2]);
|
||||
if (economyPrice < 0) {
|
||||
Dominion.config.setEconomyPrice(0.0f);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_PriceShouldBeGreaterThan0);
|
||||
} else {
|
||||
Dominion.config.setEconomyPrice(economyPrice);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setEconomyOnlyXZ(CommandSender sender, String[] args) {
|
||||
boolean economyOnlyXZ = Boolean.parseBoolean(args[2]);
|
||||
Dominion.config.setEconomyOnlyXZ(economyOnlyXZ);
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setEconomyRefund(CommandSender sender, String[] args) {
|
||||
float economyRefund = Float.parseFloat(args[2]);
|
||||
if (economyRefund < 0) {
|
||||
Dominion.config.setEconomyRefund(0.0f);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_RefundShouldBeGreaterThan0);
|
||||
} else {
|
||||
Dominion.config.setEconomyRefund(economyRefund);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setResidenceMigration(CommandSender sender, String[] args) {
|
||||
boolean residenceMigration = Boolean.parseBoolean(args[2]);
|
||||
Dominion.config.setResidenceMigration(residenceMigration);
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
|
||||
private static void setSpawnProtection(CommandSender sender, String[] args) {
|
||||
int spawnProtection = Integer.parseInt(args[2]);
|
||||
if (spawnProtection != -1 && spawnProtection <= 0) {
|
||||
Dominion.config.setSpawnProtection(1);
|
||||
Notification.error(sender, Translation.Commands_SetConfig_SpawnProtectRadiusShouldBeGreaterThan0);
|
||||
} else {
|
||||
Dominion.config.setSpawnProtection(spawnProtection);
|
||||
}
|
||||
refreshPageOrNot(sender, args);
|
||||
}
|
||||
}
|
@ -3,8 +3,8 @@ package cn.lunadeer.dominion.commands;
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.TemplateController;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.template.TemplateList;
|
||||
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 org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
@ -6,7 +6,7 @@ import cn.lunadeer.dominion.dtos.GroupDTO;
|
||||
import cn.lunadeer.dominion.dtos.MemberDTO;
|
||||
import cn.lunadeer.dominion.dtos.PlayerDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.TitleList;
|
||||
import cn.lunadeer.dominion.uis.tuis.TitleList;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -43,7 +43,7 @@ public class Title {
|
||||
}
|
||||
DominionDTO dominion = Cache.instance.getDominion(group.getDomID());
|
||||
if (dominion == null) {
|
||||
Notification.error(sender, Translation.Commands_Title_GroupDominionNotExist, group.getName());
|
||||
Notification.error(sender, Translation.Commands_Title_GroupDominionNotExist, group.getNamePlain());
|
||||
return;
|
||||
}
|
||||
if (!dominion.getOwner().equals(bukkit_player.getUniqueId())) {
|
||||
@ -53,12 +53,12 @@ public class Title {
|
||||
return;
|
||||
}
|
||||
if (!Objects.equals(member.getGroupId(), group.getId())) {
|
||||
Notification.error(sender, Translation.Commands_Title_NotGroupMember, group.getName());
|
||||
Notification.error(sender, Translation.Commands_Title_NotGroupMember, group.getNamePlain());
|
||||
return;
|
||||
}
|
||||
}
|
||||
player.setUsingGroupTitleID(group.getId());
|
||||
Notification.info(sender, Translation.Commands_Title_UseTitleSuccess, group.getName());
|
||||
Notification.info(sender, Translation.Commands_Title_UseTitleSuccess, group.getNamePlain());
|
||||
}
|
||||
int page = getPage(args, 2);
|
||||
TitleList.show(sender, page);
|
||||
|
@ -24,7 +24,7 @@ public interface AbstractOperator {
|
||||
public Result(Integer success, i18n message, Object... args) {
|
||||
this.success = success;
|
||||
this.messages = new ArrayList<>();
|
||||
this.messages.add(message.trans());
|
||||
this.messages.add(String.format(message.trans(), args));
|
||||
}
|
||||
|
||||
public Result(Integer success, String message, Object... args) {
|
||||
|
@ -103,6 +103,14 @@ public class DominionController {
|
||||
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;
|
||||
}
|
||||
// 检查世界是否可以创建
|
||||
if (worldNotValid(operator, loc1.getWorld().getName())) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_CreateDominionDisabledWorld, loc1.getWorld().getName()));
|
||||
@ -719,20 +727,28 @@ public class DominionController {
|
||||
int x_length = x2 - x1;
|
||||
int y_length = y2 - y1;
|
||||
int z_length = z2 - z1;
|
||||
if (x_length < 4 || y_length < 4 || z_length < 4) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeShouldBeGreaterThan4));
|
||||
if (x_length < Dominion.config.getLimitSizeMinX(operator.getPlayer())) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeXShouldBeGreaterThan, Dominion.config.getLimitSizeMinX(operator.getPlayer())));
|
||||
return true;
|
||||
}
|
||||
if (x_length > Dominion.config.getLimitSizeX(operator.getPlayer()) && Dominion.config.getLimitSizeX(operator.getPlayer()) > 0) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeXShouldBeLessThan, Dominion.config.getLimitSizeX(operator.getPlayer())));
|
||||
if (y_length < Dominion.config.getLimitSizeMinY(operator.getPlayer())) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeYShouldBeGreaterThan, Dominion.config.getLimitSizeMinY(operator.getPlayer())));
|
||||
return true;
|
||||
}
|
||||
if (y_length > Dominion.config.getLimitSizeY(operator.getPlayer()) && Dominion.config.getLimitSizeY(operator.getPlayer()) > 0) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeYShouldBeLessThan, Dominion.config.getLimitSizeY(operator.getPlayer())));
|
||||
if (z_length < Dominion.config.getLimitSizeMinZ(operator.getPlayer())) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeZShouldBeGreaterThan, Dominion.config.getLimitSizeMinZ(operator.getPlayer())));
|
||||
return true;
|
||||
}
|
||||
if (z_length > Dominion.config.getLimitSizeZ(operator.getPlayer()) && Dominion.config.getLimitSizeZ(operator.getPlayer()) > 0) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_SizeZShouldBeLessThan, Dominion.config.getLimitSizeZ(operator.getPlayer())));
|
||||
if (x_length > Dominion.config.getLimitSizeMaxX(operator.getPlayer()) && Dominion.config.getLimitSizeMaxX(operator.getPlayer()) > 0) {
|
||||
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;
|
||||
}
|
||||
if (y2 > Dominion.config.getLimitMaxY(operator.getPlayer())) {
|
||||
|
@ -71,7 +71,7 @@ public class MemberController {
|
||||
}
|
||||
GroupDTO group = GroupDTO.select(privilege.getGroupId());
|
||||
if (group != null) {
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerBelongToGroup, player_name, group.getName()));
|
||||
operator.setResponse(FAIL.addMessage(Translation.Messages_PlayerBelongToGroup, player_name, group.getNamePlain()));
|
||||
return;
|
||||
}
|
||||
if ((flag.equals("admin") || isAdmin(privilege)) && notOwner(operator, dominion)) {
|
||||
|
@ -2,6 +2,7 @@ package cn.lunadeer.dominion.dtos;
|
||||
|
||||
import cn.lunadeer.dominion.Cache;
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.api.dtos.Flag;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
|
||||
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 org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@ -17,13 +19,13 @@ import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
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) {
|
||||
List<DominionDTO> dominions = new ArrayList<>();
|
||||
try (ResultSet rs = DatabaseManager.instance.query(sql, args)) {
|
||||
return getDTOFromRS(rs);
|
||||
} catch (SQLException e) {
|
||||
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, sql);
|
||||
DatabaseManager.handleDatabaseError("DominionDTO.query ", e, sql);
|
||||
}
|
||||
return dominions;
|
||||
}
|
||||
@ -45,7 +47,7 @@ public class DominionDTO {
|
||||
Integer parentDomId = rs.getInt("parent_dom_id");
|
||||
String tp_location = rs.getString("tp_location");
|
||||
Map<Flag, Boolean> flags = new HashMap<>();
|
||||
for (Flag f : Flag.getDominionFlagsEnabled()) {
|
||||
for (Flag f : cn.lunadeer.dominion.dtos.Flag.getDominionFlagsEnabled()) {
|
||||
flags.put(f, rs.getBoolean(f.getFlagName()));
|
||||
}
|
||||
String color = rs.getString("color");
|
||||
@ -88,7 +90,7 @@ public class DominionDTO {
|
||||
String sql = "SELECT * FROM dominion WHERE id = ? AND id > 0;";
|
||||
List<DominionDTO> dominions = query(sql, id);
|
||||
if (dominions.isEmpty()) return null;
|
||||
return dominions.getFirst();
|
||||
return dominions.get(0);
|
||||
}
|
||||
|
||||
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;";
|
||||
List<DominionDTO> dominions = query(sql, name);
|
||||
if (dominions.isEmpty()) return null;
|
||||
return dominions.getFirst();
|
||||
return dominions.get(0);
|
||||
}
|
||||
|
||||
public static DominionDTO insert(DominionDTO dominion) {
|
||||
@ -125,16 +127,16 @@ public class DominionDTO {
|
||||
.field(dominion.parentDomId)
|
||||
.field(dominion.joinMessage).field(dominion.leaveMessage)
|
||||
.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()));
|
||||
}
|
||||
try (ResultSet rs = insert.execute()) {
|
||||
Cache.instance.loadDominions();
|
||||
List<DominionDTO> dominions = getDTOFromRS(rs);
|
||||
if (dominions.isEmpty()) return null;
|
||||
return dominions.getFirst();
|
||||
return dominions.get(0);
|
||||
} catch (SQLException e) {
|
||||
DatabaseManager.handleDatabaseError("数据库操作失败: ", e, insert.toString());
|
||||
DatabaseManager.handleDatabaseError("DominionDTO.insert ", e, insert.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -185,6 +187,8 @@ public class DominionDTO {
|
||||
this.y2.value = y2;
|
||||
this.z2.value = z2;
|
||||
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,
|
||||
@ -207,8 +211,8 @@ public class DominionDTO {
|
||||
private final Field y2 = new Field("y2", FieldType.INT);
|
||||
private final Field z2 = new Field("z2", FieldType.INT);
|
||||
private final Field parentDomId = new Field("parent_dom_id", -1);
|
||||
private final Field joinMessage = new Field("join_message", "欢迎来到 ${DOM_NAME}!");
|
||||
private final Field leaveMessage = new Field("leave_message", "你正在离开 ${DOM_NAME},欢迎下次光临~");
|
||||
private final Field joinMessage = new Field("join_message", "");
|
||||
private final Field leaveMessage = new Field("leave_message", "");
|
||||
private final Map<Flag, Boolean> flags = new HashMap<>();
|
||||
private final Field tp_location = new Field("tp_location", "default");
|
||||
private final Field color = new Field("color", "#00BFFF");
|
||||
@ -216,11 +220,13 @@ public class DominionDTO {
|
||||
|
||||
|
||||
// getters and setters
|
||||
public Integer getId() {
|
||||
@Override
|
||||
public @NotNull Integer getId() {
|
||||
return (Integer) id.value;
|
||||
}
|
||||
|
||||
public UUID getOwner() {
|
||||
@Override
|
||||
public @NotNull UUID getOwner() {
|
||||
return UUID.fromString((String) owner.value);
|
||||
}
|
||||
|
||||
@ -232,36 +238,48 @@ public class DominionDTO {
|
||||
List<DominionDTO> dominions = getDTOFromRS(rs);
|
||||
if (dominions.isEmpty()) return null;
|
||||
Cache.instance.loadDominions((Integer) id.value);
|
||||
return dominions.getFirst();
|
||||
return dominions.get(0);
|
||||
} catch (SQLException e) {
|
||||
DatabaseManager.handleDatabaseError("更新领地信息失败: ", e, updateRow.toString());
|
||||
DatabaseManager.handleDatabaseError("DominionDTO.doUpdate ", e, updateRow.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DominionDTO setOwner(UUID owner) {
|
||||
this.owner.value = owner.toString();
|
||||
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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DominionDTO setName(String name) {
|
||||
this.name.value = name;
|
||||
return doUpdate(new UpdateRow().field(this.name));
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable World getWorld() {
|
||||
return Dominion.instance.getServer().getWorld(getWorldUid());
|
||||
}
|
||||
|
||||
public UUID getWorldUid() {
|
||||
@Override
|
||||
public @NotNull UUID getWorldUid() {
|
||||
return UUID.fromString((String) world_uid.value);
|
||||
}
|
||||
|
||||
public Integer getX1() {
|
||||
@Override
|
||||
public @NotNull Integer getX1() {
|
||||
return (Integer) x1.value;
|
||||
}
|
||||
|
||||
@ -270,7 +288,8 @@ public class DominionDTO {
|
||||
return doUpdate(new UpdateRow().field(this.x1));
|
||||
}
|
||||
|
||||
public Integer getY1() {
|
||||
@Override
|
||||
public @NotNull Integer getY1() {
|
||||
return (Integer) y1.value;
|
||||
}
|
||||
|
||||
@ -279,7 +298,8 @@ public class DominionDTO {
|
||||
return doUpdate(new UpdateRow().field(this.y1));
|
||||
}
|
||||
|
||||
public Integer getZ1() {
|
||||
@Override
|
||||
public @NotNull Integer getZ1() {
|
||||
return (Integer) z1.value;
|
||||
}
|
||||
|
||||
@ -288,7 +308,8 @@ public class DominionDTO {
|
||||
return doUpdate(new UpdateRow().field(this.z1));
|
||||
}
|
||||
|
||||
public Integer getX2() {
|
||||
@Override
|
||||
public @NotNull Integer getX2() {
|
||||
return (Integer) x2.value;
|
||||
}
|
||||
|
||||
@ -297,7 +318,8 @@ public class DominionDTO {
|
||||
return doUpdate(new UpdateRow().field(this.x2));
|
||||
}
|
||||
|
||||
public Integer getY2() {
|
||||
@Override
|
||||
public @NotNull Integer getY2() {
|
||||
return (Integer) y2.value;
|
||||
}
|
||||
|
||||
@ -306,7 +328,8 @@ public class DominionDTO {
|
||||
return doUpdate(new UpdateRow().field(this.y2));
|
||||
}
|
||||
|
||||
public Integer getZ2() {
|
||||
@Override
|
||||
public @NotNull Integer getZ2() {
|
||||
return (Integer) z2.value;
|
||||
}
|
||||
|
||||
@ -315,43 +338,53 @@ public class DominionDTO {
|
||||
return doUpdate(new UpdateRow().field(this.z2));
|
||||
}
|
||||
|
||||
public Integer getSquare() {
|
||||
@Override
|
||||
public @NotNull Integer getSquare() {
|
||||
return getWidthX() * getWidthZ();
|
||||
}
|
||||
|
||||
public Integer getVolume() {
|
||||
@Override
|
||||
public @NotNull Integer getVolume() {
|
||||
return getSquare() * getHeight();
|
||||
}
|
||||
|
||||
public Integer getWidthX() {
|
||||
@Override
|
||||
public @NotNull Integer getWidthX() {
|
||||
return getX2() - getX1();
|
||||
}
|
||||
|
||||
public Integer getHeight() {
|
||||
@Override
|
||||
public @NotNull Integer getHeight() {
|
||||
return getY2() - getY1();
|
||||
}
|
||||
|
||||
public Integer getWidthZ() {
|
||||
@Override
|
||||
public @NotNull Integer getWidthZ() {
|
||||
return getZ2() - getZ1();
|
||||
}
|
||||
|
||||
public Integer getParentDomId() {
|
||||
@Override
|
||||
public @NotNull Integer getParentDomId() {
|
||||
return (Integer) parentDomId.value;
|
||||
}
|
||||
|
||||
public String getJoinMessage() {
|
||||
@Override
|
||||
public @NotNull String getJoinMessage() {
|
||||
return (String) joinMessage.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DominionDTO setJoinMessage(String joinMessage) {
|
||||
this.joinMessage.value = joinMessage;
|
||||
return doUpdate(new UpdateRow().field(this.joinMessage));
|
||||
}
|
||||
|
||||
public String getLeaveMessage() {
|
||||
@Override
|
||||
public @NotNull String getLeaveMessage() {
|
||||
return (String) leaveMessage.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DominionDTO setLeaveMessage(String leaveMessage) {
|
||||
this.leaveMessage.value = leaveMessage;
|
||||
return doUpdate(new UpdateRow().field(this.leaveMessage));
|
||||
@ -362,12 +395,28 @@ public class DominionDTO {
|
||||
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);
|
||||
Field flagField = new Field(flag.getFlagName(), value);
|
||||
return doUpdate(new UpdateRow().field(flagField));
|
||||
}
|
||||
|
||||
@Override
|
||||
public DominionDTO setXYZ(Integer x1, Integer y1, Integer z1, Integer x2, Integer y2, Integer z2) {
|
||||
this.x1.value = x1;
|
||||
this.y1.value = y1;
|
||||
@ -375,9 +424,25 @@ public class DominionDTO {
|
||||
this.x2.value = x2;
|
||||
this.y2.value = y2;
|
||||
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));
|
||||
}
|
||||
|
||||
@Override
|
||||
public DominionDTO setXYZ(int[] cords) {
|
||||
if (cords.length == 6) {
|
||||
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() {
|
||||
if (Objects.equals(tp_location.value, "default")) {
|
||||
return null;
|
||||
@ -410,11 +476,13 @@ public class DominionDTO {
|
||||
return doUpdate(new UpdateRow().field(tp_location));
|
||||
}
|
||||
|
||||
public Location getLocation1() {
|
||||
@Override
|
||||
public @NotNull Location getLocation1() {
|
||||
return new Location(getWorld(), getX1(), getY1(), getZ1());
|
||||
}
|
||||
|
||||
public Location getLocation2() {
|
||||
@Override
|
||||
public @NotNull Location getLocation2() {
|
||||
return new Location(getWorld(), getX2(), getY2(), getZ2());
|
||||
}
|
||||
|
||||
@ -423,22 +491,27 @@ public class DominionDTO {
|
||||
return doUpdate(new UpdateRow().field(this.color));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColorR() {
|
||||
return Integer.valueOf(getColor().substring(1, 3), 16);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColorG() {
|
||||
return Integer.valueOf(getColor().substring(3, 5), 16);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColorB() {
|
||||
return Integer.valueOf(getColor().substring(5, 7), 16);
|
||||
}
|
||||
|
||||
public String getColor() {
|
||||
@Override
|
||||
public @NotNull String getColor() {
|
||||
return (String) color.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColorHex() {
|
||||
return (getColorR() << 16) + (getColorG() << 8) + getColorB();
|
||||
}
|
||||
|
@ -1,18 +1,20 @@
|
||||
package cn.lunadeer.dominion.dtos;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.JsonFile;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.i18n.Localization;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.text.Collator;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
public enum Flag {
|
||||
public enum Flag implements cn.lunadeer.dominion.api.dtos.Flag {
|
||||
ANCHOR("anchor", "重生锚", "是否允许设置/使用重生锚", false, false, true),
|
||||
ANIMAL_KILLING("animal_killing", "对动物造成伤害", "是否允许对动物造成伤害", false, false, true),
|
||||
ANIMAL_SPAWN("animal_spawn", "动物生成(繁殖)", "是否允许动物生成(包括繁殖)", true, true, false),
|
||||
@ -43,6 +45,7 @@ public enum Flag {
|
||||
FLOW_IN_PROTECTION("flow_in_protection", "外部流体是否可以进入", "包含:岩浆、水(不会阻止领地内部的流体蔓延)", false, true, true),
|
||||
FLY("fly", "飞行", "不是翅鞘飞行,是类似于创造模式的飞行", false, false, false),
|
||||
GLOW("glow", "玩家发光", "类似光灵箭的高亮效果", false, false, true),
|
||||
GRAVITY_BLOCK("gravity_block", "允许外部重力方块落入", "如果禁止则领地外重力方块进入领地会变为掉落物", false, true, true),
|
||||
HARVEST("harvest", "收获", "收获庄稼、作物", false, false, true),
|
||||
HONEY("honey", "蜂巢交互", "是否可以采蜂蜜", false, false, true),
|
||||
HOOK("hook", "使用钓钩", "是否可以使用钓钩", false, false, true),
|
||||
@ -85,7 +88,6 @@ public enum Flag {
|
||||
private Boolean default_value;
|
||||
private Boolean enable;
|
||||
private final Boolean dominion_only;
|
||||
private Boolean custom_text = false;
|
||||
private final String default_display_name;
|
||||
private final String default_description;
|
||||
|
||||
@ -100,26 +102,36 @@ public enum Flag {
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
public String getFlagName() {
|
||||
@Override
|
||||
public @NotNull String getFlagName() {
|
||||
return flag_name;
|
||||
}
|
||||
|
||||
public String getDisplayName() {
|
||||
@Override
|
||||
public @NotNull String getDisplayName() {
|
||||
return display_name;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
@Override
|
||||
public @NotNull String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public Boolean getDefaultValue() {
|
||||
@Override
|
||||
public @NotNull Boolean getDefaultValue() {
|
||||
return default_value;
|
||||
}
|
||||
|
||||
public Boolean getEnable() {
|
||||
@Override
|
||||
public @NotNull Boolean getEnable() {
|
||||
return enable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Boolean isEnvironmentFlag() {
|
||||
return dominion_only;
|
||||
}
|
||||
|
||||
public void setDisplayName(String displayName) {
|
||||
this.display_name = displayName;
|
||||
}
|
||||
@ -136,30 +148,18 @@ public enum Flag {
|
||||
this.enable = enable;
|
||||
}
|
||||
|
||||
public String getDisplayNameKey() {
|
||||
return "Flags." + flag_name + ".DisplayName";
|
||||
}
|
||||
|
||||
public String getDescriptionKey() {
|
||||
return "Flags." + flag_name + ".Description";
|
||||
}
|
||||
|
||||
public static List<Flag> getAllFlags() {
|
||||
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() {
|
||||
List<Flag> flags = new ArrayList<>();
|
||||
for (Flag flag : Flag.values()) {
|
||||
@ -173,10 +173,25 @@ public enum Flag {
|
||||
return flags;
|
||||
}
|
||||
|
||||
public static List<Flag> getAllDominionFlags() {
|
||||
return new ArrayList<>(Arrays.asList(Flag.values()));
|
||||
public static boolean isDominionOnlyFlag(String flagName) {
|
||||
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() {
|
||||
List<Flag> flags = new ArrayList<>();
|
||||
@ -194,6 +209,10 @@ public enum Flag {
|
||||
return flags;
|
||||
}
|
||||
|
||||
public static List<Flag> getAllDominionFlags() {
|
||||
return new ArrayList<>(Arrays.asList(Flag.values()));
|
||||
}
|
||||
|
||||
public static List<Flag> getAllPrivilegeFlags() {
|
||||
List<Flag> flags = new ArrayList<>();
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
{
|
||||
flag_name: {
|
||||
display_name: "",
|
||||
description: "",
|
||||
default_value: true,
|
||||
enable: true
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 从文件中加载Flag配置
|
||||
*/
|
||||
|
||||
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 void loadFromFile() {
|
||||
try {
|
||||
loadLegacyJsonFlags();
|
||||
loadFlagsConfiguration();
|
||||
} catch (Exception e) {
|
||||
XLogger.err(Translation.Config_Check_LoadFlagError, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static JSONObject serializeToJson() {
|
||||
JSONObject json = new JSONObject();
|
||||
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()) {
|
||||
JSONObject flagJson = serializeToJson(flag);
|
||||
json.put(flag.getFlagName(), flagJson);
|
||||
// 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";
|
||||
}
|
||||
return json;
|
||||
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) {
|
||||
for (Flag flag : getAllFlags()) {
|
||||
try {
|
||||
JSONObject flagJson = (JSONObject) jsonObject.get(flag.getFlagName());
|
||||
if (flagJson != null) {
|
||||
flag.custom_text = (Boolean) flagJson.getOrDefault("custom_text", false);
|
||||
flag.setDefaultValue((Boolean) flagJson.getOrDefault("default_value", flag.getDefaultValue()));
|
||||
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 ignored) {
|
||||
}
|
||||
} catch (Exception e) {
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package cn.lunadeer.dominion.dtos;
|
||||
|
||||
import cn.lunadeer.dominion.Cache;
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.api.dtos.Flag;
|
||||
import cn.lunadeer.minecraftpluginutils.ColorParser;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
|
||||
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.UpdateRow;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.util.ArrayList;
|
||||
@ -16,69 +19,92 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
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 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 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<>();
|
||||
|
||||
public Integer getId() {
|
||||
@Override
|
||||
public @NotNull Integer getId() {
|
||||
return (Integer) id.value;
|
||||
}
|
||||
|
||||
public Integer getDomID() {
|
||||
@Override
|
||||
public @NotNull Integer getDomID() {
|
||||
return (Integer) domID.value;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return (String) name.value;
|
||||
@Override
|
||||
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" +
|
||||
Dominion.config.getGroupTitlePrefix() +
|
||||
(String) name_colored.value +
|
||||
(String) name_color.value +
|
||||
"&#ffffff" +
|
||||
Dominion.config.getGroupTitleSuffix();
|
||||
return ColorParser.getComponentType(with_pre_suf);
|
||||
}
|
||||
|
||||
public String getNameColoredBukkit() {
|
||||
@Override
|
||||
public @NotNull String getNameColoredBukkit() {
|
||||
String with_pre_suf = "&#ffffff" +
|
||||
Dominion.config.getGroupTitlePrefix() +
|
||||
(String) name_colored.value +
|
||||
(String) name_color.value +
|
||||
"&#ffffff" +
|
||||
Dominion.config.getGroupTitleSuffix();
|
||||
return ColorParser.getBukkitType(with_pre_suf);
|
||||
}
|
||||
|
||||
public Boolean getAdmin() {
|
||||
@Override
|
||||
public @NotNull Boolean getAdmin() {
|
||||
return (Boolean) admin.value;
|
||||
}
|
||||
|
||||
public Boolean getFlagValue(Flag flag) {
|
||||
@Override
|
||||
public @NotNull Boolean getFlagValue(@NotNull Flag flag) {
|
||||
if (!flags.containsKey(flag)) return flag.getDefaultValue();
|
||||
return flags.get(flag);
|
||||
}
|
||||
|
||||
public GroupDTO setName(String name) {
|
||||
this.name_colored.value = name;
|
||||
this.name.value = ColorParser.getPlainText(name);
|
||||
UpdateRow updateRow = new UpdateRow().field(this.name).field(this.name_colored);
|
||||
@Override
|
||||
public @NotNull Map<Flag, Boolean> getFlagsValue() {
|
||||
return flags;
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
public GroupDTO setAdmin(Boolean admin) {
|
||||
@Override
|
||||
public @Nullable GroupDTO setAdmin(@NotNull Boolean admin) {
|
||||
this.admin.value = admin;
|
||||
UpdateRow updateRow = new UpdateRow().field(this.admin);
|
||||
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);
|
||||
Field f = new Field(flag.getFlagName(), value);
|
||||
UpdateRow updateRow = new UpdateRow().field(f);
|
||||
@ -90,19 +116,19 @@ public class GroupDTO {
|
||||
InsertRow insertRow = new InsertRow().returningAll().onConflictDoNothing(new Field("id", null));
|
||||
insertRow.table("dominion_group")
|
||||
.field(group.domID)
|
||||
.field(group.name)
|
||||
.field(group.name_raw)
|
||||
.field(group.admin)
|
||||
.field(group.name_colored);
|
||||
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
|
||||
.field(group.name_color);
|
||||
for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
|
||||
insertRow.field(new Field(f.getFlagName(), dominionDTO.getFlagValue(f)));
|
||||
}
|
||||
try (ResultSet rs = insertRow.execute()) {
|
||||
List<GroupDTO> groups = getDTOFromRS(rs);
|
||||
if (groups.isEmpty()) return null;
|
||||
Cache.instance.loadGroups(groups.getFirst().getId());
|
||||
return groups.getFirst();
|
||||
Cache.instance.loadGroups(groups.get(0).getId());
|
||||
return groups.get(0);
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("创建权限组失败: ", e, "");
|
||||
DatabaseManager.handleDatabaseError("GroupDTO.create ", e, "");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -125,14 +151,14 @@ public class GroupDTO {
|
||||
String sql = "SELECT * FROM dominion_group WHERE id = ?;";
|
||||
List<GroupDTO> groups = getDTOFromRS(DatabaseManager.instance.query(sql, id));
|
||||
if (groups.isEmpty()) return null;
|
||||
return groups.getFirst();
|
||||
return groups.get(0);
|
||||
}
|
||||
|
||||
public static GroupDTO select(Integer domID, String name) {
|
||||
String sql = "SELECT * FROM dominion_group WHERE dom_id = ? AND name = ?;";
|
||||
List<GroupDTO> groups = getDTOFromRS(DatabaseManager.instance.query(sql, domID, name));
|
||||
if (groups.isEmpty()) return null;
|
||||
return groups.getFirst();
|
||||
return groups.get(0);
|
||||
}
|
||||
|
||||
public static List<GroupDTO> selectAll() {
|
||||
@ -147,10 +173,10 @@ public class GroupDTO {
|
||||
|
||||
private GroupDTO(String name, Integer domID) {
|
||||
this.domID.value = domID;
|
||||
this.name.value = ColorParser.getPlainText(name);
|
||||
this.name_colored.value = name;
|
||||
this.name_raw.value = ColorParser.getPlainText(name);
|
||||
this.name_color.value = name;
|
||||
this.admin.value = false;
|
||||
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
|
||||
for (Flag f : cn.lunadeer.dominion.dtos.Flag.getPrivilegeFlagsEnabled()) {
|
||||
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) {
|
||||
this.id.value = id;
|
||||
this.domID.value = domID;
|
||||
this.name.value = name;
|
||||
this.name_raw.value = name;
|
||||
this.admin.value = admin;
|
||||
this.flags.putAll(flags);
|
||||
this.name_colored.value = nameColored;
|
||||
this.name_color.value = nameColored;
|
||||
}
|
||||
|
||||
private static List<GroupDTO> getDTOFromRS(ResultSet rs) {
|
||||
@ -170,7 +196,7 @@ public class GroupDTO {
|
||||
try {
|
||||
while (rs.next()) {
|
||||
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()));
|
||||
}
|
||||
GroupDTO group = new GroupDTO(
|
||||
@ -197,7 +223,7 @@ public class GroupDTO {
|
||||
List<GroupDTO> groups = getDTOFromRS(rs);
|
||||
if (groups.isEmpty()) return null;
|
||||
Cache.instance.loadGroups((Integer) id.value);
|
||||
return groups.getFirst();
|
||||
return groups.get(0);
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("更新权限组失败: ", e, "");
|
||||
return null;
|
||||
|
@ -1,23 +1,26 @@
|
||||
package cn.lunadeer.dominion.dtos;
|
||||
|
||||
import cn.lunadeer.dominion.Cache;
|
||||
import cn.lunadeer.dominion.api.dtos.Flag;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.Field;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.FieldType;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.syntax.UpdateRow;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
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) {
|
||||
List<MemberDTO> players = new ArrayList<>();
|
||||
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
|
||||
return getDTOFromRS(rs);
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, sql);
|
||||
DatabaseManager.handleDatabaseError("MemberDTO.query ", e, sql);
|
||||
}
|
||||
return players;
|
||||
}
|
||||
@ -28,7 +31,7 @@ public class MemberDTO {
|
||||
try {
|
||||
while (rs.next()) {
|
||||
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()));
|
||||
}
|
||||
MemberDTO player = new MemberDTO(
|
||||
@ -42,7 +45,7 @@ public class MemberDTO {
|
||||
players.add(player);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("查询玩家权限失败: ", e, "");
|
||||
DatabaseManager.handleDatabaseError("MemberDTO.getDTOFromRS ", e, "");
|
||||
}
|
||||
return players;
|
||||
}
|
||||
@ -53,11 +56,11 @@ public class MemberDTO {
|
||||
.where("id = ?", id.value);
|
||||
try (ResultSet rs = updateRow.execute()) {
|
||||
List<MemberDTO> players = getDTOFromRS(rs);
|
||||
if (players.size() == 0) return null;
|
||||
if (players.isEmpty()) return null;
|
||||
Cache.instance.loadMembers(getPlayerUUID());
|
||||
return players.get(0);
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("更新玩家权限失败: ", e, "");
|
||||
DatabaseManager.handleDatabaseError("MemberDTO.doUpdate ", e, "");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -68,16 +71,16 @@ public class MemberDTO {
|
||||
.field(player.playerUUID)
|
||||
.field(player.admin)
|
||||
.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)));
|
||||
}
|
||||
try (ResultSet rs = insertRow.execute()) {
|
||||
Cache.instance.loadMembers(player.getPlayerUUID());
|
||||
List<MemberDTO> players = getDTOFromRS(rs);
|
||||
if (players.size() == 0) return null;
|
||||
if (players.isEmpty()) return null;
|
||||
return players.get(0);
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("插入玩家权限失败: ", e, "");
|
||||
DatabaseManager.handleDatabaseError("MemberDTO.insert ", e, "");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -85,7 +88,7 @@ public class MemberDTO {
|
||||
public static MemberDTO select(UUID playerUUID, Integer dom_id) {
|
||||
String sql = "SELECT * FROM dominion_member WHERE player_uuid = ? AND dom_id = ?;";
|
||||
List<MemberDTO> p = query(sql, playerUUID.toString(), dom_id);
|
||||
if (p.size() == 0) return null;
|
||||
if (p.isEmpty()) return null;
|
||||
return p.get(0);
|
||||
}
|
||||
|
||||
@ -126,41 +129,57 @@ public class MemberDTO {
|
||||
Field domID = new Field("dom_id", FieldType.INT);
|
||||
Field groupId = new Field("group_id", FieldType.INT);
|
||||
|
||||
@Override
|
||||
public Integer getId() {
|
||||
return (Integer) id.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public UUID getPlayerUUID() {
|
||||
return UUID.fromString((String) playerUUID.value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Boolean getAdmin() {
|
||||
return (Boolean) admin.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getDomID() {
|
||||
return (Integer) domID.value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getGroupId() {
|
||||
return (Integer) groupId.value;
|
||||
}
|
||||
|
||||
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();
|
||||
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);
|
||||
Field f = new Field(flag.getFlagName(), value);
|
||||
UpdateRow updateRow = new UpdateRow().field(f);
|
||||
return doUpdate(updateRow);
|
||||
}
|
||||
|
||||
public MemberDTO setAdmin(Boolean admin) {
|
||||
@Override
|
||||
public @Nullable MemberDTO setAdmin(@NotNull Boolean admin) {
|
||||
this.admin.value = admin;
|
||||
UpdateRow updateRow = new UpdateRow().field(this.admin);
|
||||
return doUpdate(updateRow);
|
||||
@ -175,7 +194,7 @@ public class MemberDTO {
|
||||
public MemberDTO applyTemplate(PrivilegeTemplateDTO template) {
|
||||
this.admin.value = template.getAdmin();
|
||||
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));
|
||||
updateRow.field(new Field(f.getFlagName(), template.getFlagValue(f)));
|
||||
}
|
||||
@ -196,9 +215,7 @@ public class MemberDTO {
|
||||
this.playerUUID.value = playerUUID.toString();
|
||||
this.admin.value = false;
|
||||
this.domID.value = dom.getId();
|
||||
for (Flag f : Flag.getPrivilegeFlagsEnabled()) {
|
||||
this.flags.put(f, dom.getFlagValue(f));
|
||||
}
|
||||
this.flags.putAll(dom.getGuestPrivilegeFlagValue());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ public class PlayerDTO {
|
||||
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
|
||||
return getDTOFromRS(rs);
|
||||
} catch (SQLException e) {
|
||||
DatabaseManager.handleDatabaseError("查询玩家信息失败: ", e, sql);
|
||||
DatabaseManager.handleDatabaseError("PlayerDTO.query ", e, sql);
|
||||
}
|
||||
return players;
|
||||
}
|
||||
@ -77,14 +77,14 @@ public class PlayerDTO {
|
||||
String sql = "SELECT * FROM player_name WHERE uuid = ?;";
|
||||
List<PlayerDTO> players = query(sql, uuid.toString());
|
||||
if (players.isEmpty()) return null;
|
||||
return players.getFirst();
|
||||
return players.get(0);
|
||||
}
|
||||
|
||||
public static PlayerDTO select(String name) {
|
||||
String sql = "SELECT * FROM player_name WHERE last_known_name = ?;";
|
||||
List<PlayerDTO> players = query(sql, name);
|
||||
if (players.isEmpty()) return null;
|
||||
return players.getFirst();
|
||||
return players.get(0);
|
||||
}
|
||||
|
||||
public static List<PlayerDTO> search(String name) {
|
||||
@ -114,9 +114,9 @@ public class PlayerDTO {
|
||||
try (ResultSet rs = insertRow.execute()) {
|
||||
List<PlayerDTO> players = getDTOFromRS(rs);
|
||||
if (players.isEmpty()) return null;
|
||||
return players.getFirst();
|
||||
return players.get(0);
|
||||
} catch (SQLException e) {
|
||||
DatabaseManager.handleDatabaseError("插入玩家信息失败: ", e, insertRow.toString());
|
||||
DatabaseManager.handleDatabaseError("PlayerDTO.insert ", e, insertRow.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -136,9 +136,9 @@ public class PlayerDTO {
|
||||
try (ResultSet rs = updateRow.execute()) {
|
||||
List<PlayerDTO> players = getDTOFromRS(rs);
|
||||
if (players.isEmpty()) return null;
|
||||
return players.getFirst();
|
||||
return players.get(0);
|
||||
} catch (SQLException e) {
|
||||
DatabaseManager.handleDatabaseError("更新玩家信息失败: ", e, updateRow.toString());
|
||||
DatabaseManager.handleDatabaseError("PlayerDTO.update ", e, updateRow.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package cn.lunadeer.dominion.dtos;
|
||||
|
||||
import cn.lunadeer.dominion.api.dtos.Flag;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.DatabaseManager;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.Field;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
|
||||
@ -15,7 +16,7 @@ public class PrivilegeTemplateDTO {
|
||||
try (ResultSet rs = DatabaseManager.instance.query(sql, params)) {
|
||||
return getDTOFromRS(rs);
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, sql);
|
||||
DatabaseManager.handleDatabaseError("PrivilegeTemplateDTO.query ", e, sql);
|
||||
}
|
||||
return templates;
|
||||
}
|
||||
@ -26,7 +27,7 @@ public class PrivilegeTemplateDTO {
|
||||
try {
|
||||
while (rs.next()) {
|
||||
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()));
|
||||
}
|
||||
PrivilegeTemplateDTO template = new PrivilegeTemplateDTO(
|
||||
@ -39,7 +40,7 @@ public class PrivilegeTemplateDTO {
|
||||
templates.add(template);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("查询权限模版失败: ", e, null);
|
||||
DatabaseManager.handleDatabaseError("PrivilegeTemplateDTO.getDTOFromRS", e, null);
|
||||
}
|
||||
return templates;
|
||||
}
|
||||
@ -53,10 +54,10 @@ public class PrivilegeTemplateDTO {
|
||||
.returningAll();
|
||||
try (ResultSet rs = insertRow.execute()) {
|
||||
List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs);
|
||||
if (templates.size() == 0) return null;
|
||||
if (templates.isEmpty()) return null;
|
||||
return templates.get(0);
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("创建权限模版失败: ", e, null);
|
||||
DatabaseManager.handleDatabaseError("PrivilegeTemplateDTO.create ", e, null);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -68,10 +69,10 @@ public class PrivilegeTemplateDTO {
|
||||
.where("id = ?", id.value);
|
||||
try (ResultSet rs = updateRow.execute()) {
|
||||
List<PrivilegeTemplateDTO> templates = getDTOFromRS(rs);
|
||||
if (templates.size() == 0) return null;
|
||||
if (templates.isEmpty()) return null;
|
||||
return templates.get(0);
|
||||
} catch (Exception e) {
|
||||
DatabaseManager.handleDatabaseError("更新权限模版失败: ", e, null);
|
||||
DatabaseManager.handleDatabaseError("PrivilegeTemplateDTO.doUpdate ", e, null);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -79,7 +80,7 @@ public class PrivilegeTemplateDTO {
|
||||
public static PrivilegeTemplateDTO select(UUID creator, String name) {
|
||||
String sql = "SELECT * FROM privilege_template WHERE creator = ? AND name = ?;";
|
||||
List<PrivilegeTemplateDTO> templates = query(sql, creator.toString(), name);
|
||||
if (templates.size() == 0) return null;
|
||||
if (templates.isEmpty()) return null;
|
||||
return templates.get(0);
|
||||
}
|
||||
|
||||
@ -101,9 +102,9 @@ public class PrivilegeTemplateDTO {
|
||||
this.flags.putAll(flags);
|
||||
}
|
||||
|
||||
private Integer id;
|
||||
private UUID creator;
|
||||
private String name;
|
||||
private final Integer id;
|
||||
private final UUID creator;
|
||||
private final String name;
|
||||
private Boolean admin;
|
||||
|
||||
private final Map<Flag, Boolean> flags = new HashMap<>();
|
||||
|
@ -2,26 +2,27 @@ package cn.lunadeer.dominion.managers;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.dtos.Flag;
|
||||
import cn.lunadeer.dominion.utils.MessageDisplay;
|
||||
import cn.lunadeer.minecraftpluginutils.VaultConnect.VaultConnect;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
public class ConfigManager {
|
||||
public static ConfigManager instance;
|
||||
|
||||
public ConfigManager(Dominion plugin) {
|
||||
instance = this;
|
||||
new Translation(plugin);
|
||||
_plugin = plugin;
|
||||
_plugin.saveDefaultConfig();
|
||||
reload();
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
@ -38,29 +39,26 @@ public class ConfigManager {
|
||||
_db_name = _file.getString("Database.Name", "dominion");
|
||||
_db_user = _file.getString("Database.User", "postgres");
|
||||
_db_pass = _file.getString("Database.Pass", "postgres");
|
||||
|
||||
_auto_create_radius = _file.getInt("AutoCreateRadius", 10);
|
||||
if (_auto_create_radius == 0) {
|
||||
XLogger.err(Translation.Config_Check_AutoCreateRadiusError);
|
||||
setAutoCreateRadius(10);
|
||||
}
|
||||
_default_join_message = _file.getString("DefaultJoinMessage", "&3{OWNER}: Welcome to {DOM}!");
|
||||
_default_leave_message = _file.getString("DefaultLeaveMessage", "&3{OWNER}: Leaving {DOM}...");
|
||||
|
||||
_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);
|
||||
_blue_map = _file.getBoolean("BlueMap", false);
|
||||
_dynmap = _file.getBoolean("Dynmap", false);
|
||||
_auto_clean_after_days = _file.getInt("AutoCleanAfterDays", 180);
|
||||
if (_auto_clean_after_days == 0) {
|
||||
XLogger.err(Translation.Config_Check_AutoCleanAfterDaysError);
|
||||
setAutoCleanAfterDays(180);
|
||||
}
|
||||
_limit_op_bypass = _file.getBoolean("Limit.OpByPass", true);
|
||||
_check_update = _file.getBoolean("CheckUpdate", true);
|
||||
_tp_enable = _file.getBoolean("Teleport.Enable", false);
|
||||
_tp_delay = _file.getInt("Teleport.Delay", 0);
|
||||
_tp_cool_down = _file.getInt("Teleport.CoolDown", 0);
|
||||
_tool = _file.getString("Tool", "ARROW");
|
||||
if (Material.getMaterial(_tool) == null) {
|
||||
XLogger.err(Translation.Config_Check_ToolNameError);
|
||||
setTool("ARROW");
|
||||
}
|
||||
_info_tool = _file.getString("InfoTool", "STRING");
|
||||
|
||||
_economy_enable = _file.getBoolean("Economy.Enable", false);
|
||||
if (getEconomyEnable()) {
|
||||
new VaultConnect(this._plugin);
|
||||
@ -72,61 +70,40 @@ public class ConfigManager {
|
||||
_group_title_suffix = _file.getString("GroupTitle.Suffix", "&#ffffff]");
|
||||
|
||||
GroupLimit defaultGroup = new GroupLimit();
|
||||
defaultGroup.setLimitSizeX(_file.getInt("Limit.SizeX", 128));
|
||||
defaultGroup.setLimitSizeY(_file.getInt("Limit.SizeY", 64));
|
||||
defaultGroup.setLimitSizeZ(_file.getInt("Limit.SizeZ", 128));
|
||||
defaultGroup.setLimitMinY(_file.getInt("Limit.MinY", -64));
|
||||
defaultGroup.setLimitMaxY(_file.getInt("Limit.MaxY", 320));
|
||||
defaultGroup.setLimitAmount(_file.getInt("Limit.Amount", 10));
|
||||
defaultGroup.setLimitDepth(_file.getInt("Limit.Depth", 3));
|
||||
defaultGroup.setLimitVert(_file.getBoolean("Limit.Vert", false));
|
||||
defaultGroup.setWorldBlackList(_file.getStringList("Limit.WorldBlackList"));
|
||||
if (_file.contains("Limit.SizeX")) { // todo: should be removed in the future
|
||||
defaultGroup.setLimitSizeMaxX(_file.getInt("Limit.SizeX", 128), null);
|
||||
defaultGroup.setLimitSizeMaxY(_file.getInt("Limit.SizeY", 64), null);
|
||||
defaultGroup.setLimitSizeMaxZ(_file.getInt("Limit.SizeZ", 128), null);
|
||||
defaultGroup.setLimitSizeMinX(4, null);
|
||||
defaultGroup.setLimitSizeMinY(4, null);
|
||||
defaultGroup.setLimitSizeMinZ(4, null);
|
||||
} else {
|
||||
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.setPriceOnlyXZ(_file.getBoolean("Economy.OnlyXZ", false));
|
||||
defaultGroup.setRefundRatio(_file.getDouble("Economy.Refund", 0.85));
|
||||
if (defaultGroup.getLimitSizeX() <= 4 && defaultGroup.getLimitSizeX() != -1) {
|
||||
XLogger.err(Translation.Config_Check_LimitSizeXError);
|
||||
setLimitSizeX(128);
|
||||
ConfigurationSection worldSettings = _file.getConfigurationSection("Limit.WorldSettings");
|
||||
if (worldSettings != null) {
|
||||
defaultGroup.addWorldLimits(WorldSetting.load("config.yml", worldSettings));
|
||||
}
|
||||
if (defaultGroup.getLimitSizeY() <= 4 && defaultGroup.getLimitSizeY() != -1) {
|
||||
XLogger.err(Translation.Config_Check_LimitSizeYError);
|
||||
setLimitSizeY(64);
|
||||
}
|
||||
if (defaultGroup.getLimitSizeZ() <= 4 && defaultGroup.getLimitSizeZ() != -1) {
|
||||
XLogger.err(Translation.Config_Check_LimitSizeZError);
|
||||
setLimitSizeZ(128);
|
||||
}
|
||||
if (defaultGroup.getLimitMinY() >= defaultGroup.getLimitMaxY()) {
|
||||
XLogger.err(Translation.Config_Check_LimitMinYError);
|
||||
setLimitMinY(-64);
|
||||
setLimitMaxY(320);
|
||||
}
|
||||
if (defaultGroup.getRefundRatio() < 0.0 || defaultGroup.getRefundRatio() > 1.0) {
|
||||
XLogger.err(Translation.Config_Check_RefundError);
|
||||
setEconomyRefund(0.85f);
|
||||
}
|
||||
if (defaultGroup.getPrice() < 0.0) {
|
||||
XLogger.err(Translation.Config_Check_PriceError);
|
||||
setEconomyPrice(10.0f);
|
||||
}
|
||||
if (defaultGroup.getLimitVert() && defaultGroup.getLimitSizeY() <= defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY()) {
|
||||
XLogger.warn(Translation.Config_Check_LimitSizeYAutoAdjust, (defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY() + 1));
|
||||
setLimitSizeY(defaultGroup.getLimitMaxY() - defaultGroup.getLimitMinY() + 1);
|
||||
}
|
||||
if (defaultGroup.getLimitAmount() < 0 && defaultGroup.getLimitAmount() != -1) {
|
||||
XLogger.err(Translation.Config_Check_AmountError);
|
||||
setLimitAmount(10);
|
||||
}
|
||||
if (defaultGroup.getLimitDepth() < 0 && defaultGroup.getLimitDepth() != -1) {
|
||||
XLogger.err(Translation.Config_Check_DepthError);
|
||||
setLimitDepth(3);
|
||||
}
|
||||
limits.put("default", defaultGroup);
|
||||
groupLimits.put("default", defaultGroup);
|
||||
|
||||
limits.putAll(GroupLimit.loadGroups(_plugin));
|
||||
groupLimits.putAll(GroupLimit.loadGroups(_plugin));
|
||||
|
||||
checkRules();
|
||||
saveAll(); // 回写文件 防止文件中的数据不完整
|
||||
Flag.loadFromJson(); // 加载 Flag 配置
|
||||
Flag.loadFromFile(); // 加载 Flag 配置
|
||||
}
|
||||
|
||||
public void saveAll() {
|
||||
@ -151,30 +128,46 @@ public class ConfigManager {
|
||||
|
||||
_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.setInlineComments("Limit.SpawnProtection", Arrays.asList(Translation.Config_Comment_SpawnProtectRadius.trans(), Translation.Config_Comment_NegativeOneDisabled.trans()));
|
||||
_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.MinY", groupLimits.get("default").getLimitMinY(null));
|
||||
_file.setInlineComments("Limit.MinY", List.of(Translation.Config_Comment_MinY.trans()));
|
||||
_file.set("Limit.MaxY", limits.get("default").getLimitMaxY());
|
||||
_file.set("Limit.MaxY", groupLimits.get("default").getLimitMaxY(null));
|
||||
_file.setInlineComments("Limit.MaxY", List.of(Translation.Config_Comment_MaxY.trans()));
|
||||
_file.set("Limit.SizeX", limits.get("default").getLimitSizeX());
|
||||
_file.setInlineComments("Limit.SizeX", Arrays.asList(Translation.Config_Comment_SizeX.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans()));
|
||||
_file.set("Limit.SizeY", limits.get("default").getLimitSizeY());
|
||||
_file.setInlineComments("Limit.SizeY", Arrays.asList(Translation.Config_Comment_SizeY.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans()));
|
||||
_file.set("Limit.SizeZ", limits.get("default").getLimitSizeZ());
|
||||
_file.setInlineComments("Limit.SizeZ", Arrays.asList(Translation.Config_Comment_SizeZ.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans()));
|
||||
_file.set("Limit.Amount", limits.get("default").getLimitAmount());
|
||||
_file.setInlineComments("Limit.Amount", List.of(Translation.Config_Comment_Amount.trans(), Translation.Config_Comment_NegativeOneUnlimited.trans()));
|
||||
_file.set("Limit.Depth", limits.get("default").getLimitDepth());
|
||||
_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", limits.get("default").getLimitVert());
|
||||
_file.set("Limit.Size.MaxX", groupLimits.get("default").getLimitSizeMaxX(null));
|
||||
_file.setInlineComments("Limit.Size.MaxX", List.of(Translation.Config_Comment_SizeMaxX.trans() + Translation.Config_Comment_NegativeOneUnlimited.trans()));
|
||||
_file.set("Limit.Size.MaxY", groupLimits.get("default").getLimitSizeMaxY(null));
|
||||
_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.WorldBlackList", limits.get("default").getWorldBlackList());
|
||||
_file.setInlineComments("Limit.WorldBlackList", List.of(Translation.Config_Comment_DisabledWorlds.trans()));
|
||||
_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.Delay", _tp_delay);
|
||||
@ -187,14 +180,16 @@ public class ConfigManager {
|
||||
|
||||
_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.Price", limits.get("default").getPrice());
|
||||
_file.set("Economy.Price", groupLimits.get("default").getPrice());
|
||||
_file.setInlineComments("Economy.Price", List.of(Translation.Config_Comment_Price.trans()));
|
||||
_file.set("Economy.OnlyXZ", limits.get("default").getPriceOnlyXZ());
|
||||
_file.set("Economy.OnlyXZ", groupLimits.get("default").getPriceOnlyXZ());
|
||||
_file.setInlineComments("Economy.OnlyXZ", List.of(Translation.Config_Comment_OnlyXZ.trans()));
|
||||
_file.set("Economy.Refund", limits.get("default").getRefundRatio());
|
||||
_file.set("Economy.Refund", groupLimits.get("default").getRefundRatio());
|
||||
_file.setInlineComments("Economy.Refund", List.of(Translation.Config_Comment_Refund.trans()));
|
||||
|
||||
_file.set("FlyPermissionNodes", _fly_permission_nodes);
|
||||
@ -242,12 +237,6 @@ public class ConfigManager {
|
||||
return _db_type;
|
||||
}
|
||||
|
||||
public void setDbType(String db_type) {
|
||||
_db_type = db_type;
|
||||
_file.set("Database.Type", db_type);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public String getDbHost() {
|
||||
return _db_host;
|
||||
}
|
||||
@ -263,7 +252,6 @@ public class ConfigManager {
|
||||
public void setDbUser(String db_user) {
|
||||
_db_user = db_user;
|
||||
_file.set("Database.User", db_user);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public String getDbUser() {
|
||||
@ -276,51 +264,51 @@ public class ConfigManager {
|
||||
public void setDbPass(String db_pass) {
|
||||
_db_pass = db_pass;
|
||||
_file.set("Database.Pass", db_pass);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public String getDbPass() {
|
||||
return _db_pass;
|
||||
}
|
||||
|
||||
public Integer getLimitSizeX(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getLimitSizeX();
|
||||
public Integer getLimitSizeMaxX(Player player) {
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitSizeMaxX(player.getWorld());
|
||||
}
|
||||
|
||||
public void setLimitSizeX(Integer max_x) {
|
||||
limits.get("default").setLimitSizeX(max_x);
|
||||
_file.set("Limit.SizeX", max_x);
|
||||
_plugin.saveConfig();
|
||||
public Integer getLimitSizeMaxY(Player player) {
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitSizeMaxY(player.getWorld());
|
||||
}
|
||||
|
||||
public Integer getLimitSizeY(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getLimitSizeY();
|
||||
public Integer getLimitSizeMaxZ(Player player) {
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitSizeMaxZ(player.getWorld());
|
||||
}
|
||||
|
||||
public void setLimitSizeY(Integer max_y) {
|
||||
limits.get("default").setLimitSizeY(max_y);
|
||||
_file.set("Limit.SizeY", max_y);
|
||||
_plugin.saveConfig();
|
||||
public Integer getLimitSizeMinX(Player player) {
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitSizeMinX(player.getWorld());
|
||||
}
|
||||
|
||||
public Integer getLimitSizeZ(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getLimitSizeZ();
|
||||
public Integer getLimitSizeMinY(Player player) {
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitSizeMinY(player.getWorld());
|
||||
}
|
||||
|
||||
public void setLimitSizeZ(Integer max_z) {
|
||||
limits.get("default").setLimitSizeZ(max_z);
|
||||
_file.set("Limit.SizeZ", max_z);
|
||||
_plugin.saveConfig();
|
||||
public Integer getLimitSizeMinZ(Player player) {
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitSizeMinZ(player.getWorld());
|
||||
}
|
||||
|
||||
public Integer getAutoCreateRadius() {
|
||||
return _auto_create_radius;
|
||||
}
|
||||
|
||||
public String getDefaultJoinMessage() {
|
||||
return _default_join_message;
|
||||
}
|
||||
|
||||
public String getDefaultLeaveMessage() {
|
||||
return _default_leave_message;
|
||||
}
|
||||
|
||||
public void setAutoCreateRadius(Integer radius) {
|
||||
_auto_create_radius = radius;
|
||||
_file.set("AutoCreateRadius", radius);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public Boolean getBlueMap() {
|
||||
@ -335,76 +323,47 @@ public class ConfigManager {
|
||||
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) {
|
||||
_auto_clean_after_days = auto_clean_after_days;
|
||||
_file.set("AutoCleanAfterDays", auto_clean_after_days);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public Integer getLimitMinY(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getLimitMinY();
|
||||
}
|
||||
|
||||
public void setLimitMinY(Integer limit_bottom) {
|
||||
limits.get("default").setLimitMinY(limit_bottom);
|
||||
_file.set("Limit.MinY", limit_bottom);
|
||||
_plugin.saveConfig();
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitMinY(player.getWorld());
|
||||
}
|
||||
|
||||
public Integer getLimitMaxY(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getLimitMaxY();
|
||||
}
|
||||
|
||||
public void setLimitMaxY(Integer limit_top) {
|
||||
limits.get("default").setLimitMaxY(limit_top);
|
||||
_file.set("Limit.MaxY", limit_top);
|
||||
_plugin.saveConfig();
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitMaxY(player.getWorld());
|
||||
}
|
||||
|
||||
public Integer getLimitAmount(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getLimitAmount();
|
||||
}
|
||||
|
||||
public void setLimitAmount(Integer limit_amount) {
|
||||
limits.get("default").setLimitAmount(limit_amount);
|
||||
_file.set("Limit.Amount", limit_amount);
|
||||
_plugin.saveConfig();
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitAmount(player.getWorld());
|
||||
}
|
||||
|
||||
public Integer getLimitDepth(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getLimitDepth();
|
||||
}
|
||||
|
||||
public void setLimitDepth(Integer limit_depth) {
|
||||
limits.get("default").setLimitDepth(limit_depth);
|
||||
_file.set("Limit.Depth", limit_depth);
|
||||
_plugin.saveConfig();
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitDepth(player.getWorld());
|
||||
}
|
||||
|
||||
public Boolean getLimitVert(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getLimitVert();
|
||||
}
|
||||
|
||||
public void setLimitVert(Boolean limit_vert) {
|
||||
limits.get("default").setLimitVert(limit_vert);
|
||||
_file.set("Limit.Vert", limit_vert);
|
||||
_plugin.saveConfig();
|
||||
return groupLimits.get(getPlayerGroup(player)).getLimitVert(player.getWorld());
|
||||
}
|
||||
|
||||
public List<String> getWorldBlackList(Player player) {
|
||||
return limits.get(getPlayerGroup(player)).getWorldBlackList();
|
||||
return groupLimits.get(getPlayerGroup(player)).getWorldBlackList();
|
||||
}
|
||||
|
||||
public Boolean getLimitOpBypass() {
|
||||
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() {
|
||||
return _check_update;
|
||||
}
|
||||
@ -413,12 +372,6 @@ public class ConfigManager {
|
||||
return _tp_enable;
|
||||
}
|
||||
|
||||
public void setTpEnable(Boolean tp_enable) {
|
||||
_tp_enable = tp_enable;
|
||||
_file.set("Teleport.Enable", tp_enable);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public Integer getTpDelay() {
|
||||
return _tp_delay;
|
||||
}
|
||||
@ -426,7 +379,6 @@ public class ConfigManager {
|
||||
public void setTpDelay(Integer tp_delay) {
|
||||
_tp_delay = tp_delay;
|
||||
_file.set("Teleport.Delay", tp_delay);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public Integer getTpCoolDown() {
|
||||
@ -436,7 +388,6 @@ public class ConfigManager {
|
||||
public void setTpCoolDown(Integer tp_cool_down) {
|
||||
_tp_cool_down = tp_cool_down;
|
||||
_file.set("Teleport.CoolDown", tp_cool_down);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public Material getTool() {
|
||||
@ -446,79 +397,45 @@ public class ConfigManager {
|
||||
public void setTool(String tool) {
|
||||
_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() {
|
||||
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) {
|
||||
return limits.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();
|
||||
return groupLimits.get(getPlayerGroup(player)).getPrice().floatValue();
|
||||
}
|
||||
|
||||
public Boolean getEconomyOnlyXZ(Player player) {
|
||||
return limits.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();
|
||||
return groupLimits.get(getPlayerGroup(player)).getPriceOnlyXZ();
|
||||
}
|
||||
|
||||
public Float getEconomyRefund(Player player) {
|
||||
return limits.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();
|
||||
return groupLimits.get(getPlayerGroup(player)).getRefundRatio().floatValue();
|
||||
}
|
||||
|
||||
public List<String> getFlyPermissionNodes() {
|
||||
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() {
|
||||
return _residence_migration;
|
||||
}
|
||||
|
||||
public void setResidenceMigration(Boolean residence_migration) {
|
||||
_residence_migration = residence_migration;
|
||||
_file.set("ResidenceMigration", residence_migration);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public Integer getSpawnProtection() {
|
||||
return _spawn_protection;
|
||||
}
|
||||
|
||||
public void setSpawnProtection(Integer spawn_protection) {
|
||||
_spawn_protection = spawn_protection;
|
||||
_file.set("Limit.SpawnProtection", spawn_protection);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public Boolean getGroupTitleEnable() {
|
||||
return _group_title_enable;
|
||||
}
|
||||
@ -526,27 +443,57 @@ public class ConfigManager {
|
||||
public void setGroupTitleEnable(Boolean group_title_enable) {
|
||||
_group_title_enable = group_title_enable;
|
||||
_file.set("GroupTitle.Enable", group_title_enable);
|
||||
_plugin.saveConfig();
|
||||
}
|
||||
|
||||
public String getGroupTitlePrefix() {
|
||||
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() {
|
||||
return _group_title_suffix;
|
||||
}
|
||||
|
||||
public void setGroupTitleSuffix(String group_title_suffix) {
|
||||
_group_title_suffix = group_title_suffix;
|
||||
_file.set("GroupTitle.Suffix", group_title_suffix);
|
||||
_plugin.saveConfig();
|
||||
public String getLanguage() {
|
||||
return _language;
|
||||
}
|
||||
|
||||
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;
|
||||
@ -564,6 +511,8 @@ public class ConfigManager {
|
||||
private String _language;
|
||||
|
||||
private Integer _auto_create_radius;
|
||||
private String _default_join_message;
|
||||
private String _default_leave_message;
|
||||
|
||||
private Boolean _limit_op_bypass;
|
||||
|
||||
@ -576,7 +525,9 @@ public class ConfigManager {
|
||||
private Boolean _tp_enable;
|
||||
private Integer _tp_delay;
|
||||
private Integer _tp_cool_down;
|
||||
|
||||
private String _tool;
|
||||
private String _info_tool;
|
||||
|
||||
private Boolean _economy_enable;
|
||||
|
||||
@ -588,13 +539,16 @@ public class ConfigManager {
|
||||
private String _group_title_prefix;
|
||||
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) {
|
||||
if (player == null) {
|
||||
return "default";
|
||||
}
|
||||
for (String group : limits.keySet()) {
|
||||
for (String group : groupLimits.keySet()) {
|
||||
if (group.equals("default")) {
|
||||
continue;
|
||||
}
|
||||
|
@ -1,16 +1,27 @@
|
||||
package cn.lunadeer.dominion.managers;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.commands.Operator;
|
||||
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.syntax.AddColumn;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.syntax.CreateTable;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.syntax.InsertRow;
|
||||
import cn.lunadeer.minecraftpluginutils.databse.syntax.RemoveColumn;
|
||||
import org.bukkit.World;
|
||||
import 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.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class DatabaseTables {
|
||||
public static void migrate() {
|
||||
@ -114,8 +125,8 @@ public class DatabaseTables {
|
||||
Field server_dom_y2_field = new Field("y2", 2147483647);
|
||||
Field server_dom_z2_field = new Field("z2", 2147483647);
|
||||
Field server_dom_parent_dom_id_field = new Field("parent_dom_id", -1);
|
||||
Field server_dom_join_message_field = new Field("join_message", "欢迎");
|
||||
Field server_dom_leave_message_field = new Field("leave_message", "再见");
|
||||
Field server_dom_join_message_field = new Field("join_message", "");
|
||||
Field server_dom_leave_message_field = new Field("leave_message", "");
|
||||
InsertRow insert_server_dom = new InsertRow().table("dominion").onConflictDoNothing(server_dom_id_field)
|
||||
.field(server_dom_id_field)
|
||||
.field(server_dom_owner_field)
|
||||
@ -260,4 +271,79 @@ public class DatabaseTables {
|
||||
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]);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -1,26 +1,22 @@
|
||||
package cn.lunadeer.dominion.managers;
|
||||
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
public class GroupLimit {
|
||||
private final YamlConfiguration config;
|
||||
|
||||
|
||||
private YamlConfiguration config;
|
||||
private final File file_path;
|
||||
private Integer min_y;
|
||||
private Integer max_y;
|
||||
private Integer size_x;
|
||||
private Integer size_y;
|
||||
private Integer size_z;
|
||||
private Integer amount;
|
||||
private Integer depth;
|
||||
private Boolean vert;
|
||||
private List<String> world_black_list;
|
||||
private final Map<String, WorldSetting> world_limits = new HashMap<>();
|
||||
private Double price;
|
||||
private Boolean only_xz;
|
||||
private Double refund;
|
||||
@ -28,93 +24,132 @@ public class GroupLimit {
|
||||
public GroupLimit() {
|
||||
this.file_path = null;
|
||||
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;
|
||||
config = YamlConfiguration.loadConfiguration(this.file_path);
|
||||
setLimitMinY(config.getInt("MinY", -64));
|
||||
setLimitMaxY(config.getInt("MaxY", 320));
|
||||
if (getLimitMinY() >= getLimitMaxY()) {
|
||||
XLogger.err(Translation.Config_Check_GroupMinYError, this.file_path.getName());
|
||||
setLimitMinY(-64);
|
||||
setLimitMaxY(320);
|
||||
WorldSetting defaultSetting = new WorldSetting(filePath.getName());
|
||||
defaultSetting.min_y = config.getInt("MinY", -64);
|
||||
defaultSetting.max_y = config.getInt("MaxY", 320);
|
||||
if (config.contains("SizeX")) { // todo: should be removed in the future
|
||||
defaultSetting.size_max_x = config.getInt("SizeX", 128);
|
||||
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));
|
||||
if (getLimitSizeX() <= 4 && getLimitSizeX() != -1) {
|
||||
XLogger.err(Translation.Config_Check_GroupSizeXError, this.file_path.getName());
|
||||
setLimitSizeX(128);
|
||||
defaultSetting.amount = config.getInt("Amount", 10);
|
||||
defaultSetting.depth = config.getInt("Depth", 3);
|
||||
defaultSetting.vert = config.getBoolean("Vert", false);
|
||||
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));
|
||||
if (getLimitSizeY() <= 4 && getLimitSizeY() != -1) {
|
||||
XLogger.err(Translation.Config_Check_GroupSizeYError, this.file_path.getName());
|
||||
setLimitSizeY(64);
|
||||
}
|
||||
setLimitSizeZ(config.getInt("SizeZ", 128));
|
||||
if (getLimitSizeZ() <= 4 && getLimitSizeZ() != -1) {
|
||||
XLogger.err(Translation.Config_Check_GroupSizeZError, this.file_path.getName());
|
||||
setLimitSizeZ(128);
|
||||
}
|
||||
setLimitAmount(config.getInt("Amount", 10));
|
||||
if (getLimitAmount() <= 0 && getLimitAmount() != -1) {
|
||||
XLogger.err(Translation.Config_Check_GroupAmountError, this.file_path.getName());
|
||||
setLimitAmount(10);
|
||||
}
|
||||
setLimitDepth(config.getInt("Depth", 3));
|
||||
if (getLimitDepth() <= 0 && getLimitDepth() != -1) {
|
||||
XLogger.err(Translation.Config_Check_GroupDepthError, this.file_path.getName());
|
||||
setLimitDepth(3);
|
||||
}
|
||||
setLimitVert(config.getBoolean("Vert", false));
|
||||
setWorldBlackList(config.getStringList("WorldBlackList"));
|
||||
setPrice(config.getDouble("Price", 10.0));
|
||||
if (getPrice() < 0.0) {
|
||||
XLogger.err(Translation.Config_Check_GroupPriceError, this.file_path.getName());
|
||||
setPrice(10.0);
|
||||
}
|
||||
setPriceOnlyXZ(config.getBoolean("OnlyXZ", false));
|
||||
setRefundRatio(config.getDouble("Refund", 0.85));
|
||||
if (getRefundRatio() < 0.0 || getRefundRatio() > 1.0) {
|
||||
XLogger.err(Translation.Config_Check_GroupRefundError, this.file_path.getName());
|
||||
setRefundRatio(0.85);
|
||||
}
|
||||
save(); // 保存一次,确保文件中的数据是合法的
|
||||
price = config.getDouble("Price", 10.0);
|
||||
only_xz = config.getBoolean("OnlyXZ", false);
|
||||
refund = config.getDouble("Refund", 0.85);
|
||||
checkRules();
|
||||
saveAll();
|
||||
}
|
||||
|
||||
public Integer getLimitMinY() {
|
||||
return min_y;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getLimitMaxY() {
|
||||
return max_y;
|
||||
public Integer getLimitMaxY(@Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
return world_limits.get("default").max_y;
|
||||
} else {
|
||||
return world_limits.get(world.getName()).max_y;
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getLimitSizeX() {
|
||||
return size_x;
|
||||
public Integer getLimitSizeMaxX(@Nullable World world) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getLimitSizeY() {
|
||||
return size_y;
|
||||
public Integer getLimitSizeMaxY(@Nullable World world) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getLimitSizeZ() {
|
||||
return size_z;
|
||||
public Integer getLimitSizeMaxZ(@Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
return world_limits.get("default").size_max_z;
|
||||
} else {
|
||||
return world_limits.get(world.getName()).size_max_z;
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getLimitAmount() {
|
||||
return amount;
|
||||
public Integer getLimitSizeMinX(@Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
return world_limits.get("default").size_min_x;
|
||||
} else {
|
||||
return world_limits.get(world.getName()).size_min_x;
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getLimitDepth() {
|
||||
return depth;
|
||||
public Integer getLimitSizeMinY(@Nullable World world) {
|
||||
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 Boolean getLimitVert() {
|
||||
return vert;
|
||||
public Integer getLimitSizeMinZ(@Nullable World world) {
|
||||
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 List<String> getWorldBlackList() {
|
||||
return world_black_list;
|
||||
public Integer getLimitAmount(@Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
return world_limits.get("default").amount;
|
||||
} else {
|
||||
return world_limits.get(world.getName()).amount;
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getLimitDepth(@Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
return world_limits.get("default").depth;
|
||||
} else {
|
||||
return world_limits.get(world.getName()).depth;
|
||||
}
|
||||
}
|
||||
|
||||
public Boolean getLimitVert(@Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
return world_limits.get("default").vert;
|
||||
} else {
|
||||
return world_limits.get(world.getName()).vert;
|
||||
}
|
||||
}
|
||||
|
||||
public Double getPrice() {
|
||||
@ -130,89 +165,109 @@ public class GroupLimit {
|
||||
}
|
||||
|
||||
|
||||
public void setLimitMinY(Integer min_y) {
|
||||
this.min_y = min_y;
|
||||
this.config.set("MinY", min_y);
|
||||
this.save();
|
||||
public void setLimitMinY(Integer min_y, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").min_y = min_y;
|
||||
} else {
|
||||
world_limits.get(world.getName()).min_y = min_y;
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimitMaxY(Integer max_y) {
|
||||
this.max_y = max_y;
|
||||
this.config.set("MaxY", max_y);
|
||||
this.save();
|
||||
public void setLimitMaxY(Integer max_y, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").max_y = max_y;
|
||||
} else {
|
||||
world_limits.get(world.getName()).max_y = max_y;
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimitSizeX(Integer size_x) {
|
||||
this.size_x = size_x;
|
||||
this.config.set("SizeX", size_x);
|
||||
this.save();
|
||||
public void setLimitSizeMaxX(Integer size_x, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").size_max_x = size_x;
|
||||
} else {
|
||||
world_limits.get(world.getName()).size_max_x = size_x;
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimitSizeY(Integer size_y) {
|
||||
this.size_y = size_y;
|
||||
this.config.set("SizeY", size_y);
|
||||
this.save();
|
||||
public void setLimitSizeMaxY(Integer size_y, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").size_max_y = size_y;
|
||||
} else {
|
||||
world_limits.get(world.getName()).size_max_y = size_y;
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimitSizeZ(Integer size_z) {
|
||||
this.size_z = size_z;
|
||||
this.config.set("SizeZ", size_z);
|
||||
this.save();
|
||||
public void setLimitSizeMaxZ(Integer size_z, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").size_max_z = size_z;
|
||||
} else {
|
||||
world_limits.get(world.getName()).size_max_z = size_z;
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimitAmount(Integer amount) {
|
||||
this.amount = amount;
|
||||
this.config.set("Amount", amount);
|
||||
this.save();
|
||||
public void setLimitSizeMinX(Integer size_x, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").size_min_x = size_x;
|
||||
} else {
|
||||
world_limits.get(world.getName()).size_min_x = size_x;
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimitDepth(Integer depth) {
|
||||
this.depth = depth;
|
||||
this.config.set("Depth", depth);
|
||||
this.save();
|
||||
public void setLimitSizeMinY(Integer size_y, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").size_min_y = size_y;
|
||||
} else {
|
||||
world_limits.get(world.getName()).size_min_y = size_y;
|
||||
}
|
||||
}
|
||||
|
||||
public void setLimitVert(Boolean vert) {
|
||||
this.vert = vert;
|
||||
this.config.set("Vert", vert);
|
||||
this.save();
|
||||
public void setLimitSizeMinZ(Integer size_z, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").size_min_z = size_z;
|
||||
} else {
|
||||
world_limits.get(world.getName()).size_min_z = size_z;
|
||||
}
|
||||
}
|
||||
|
||||
public void setWorldBlackList(List<String> world_black_list) {
|
||||
this.world_black_list = world_black_list;
|
||||
this.config.set("WorldBlackList", world_black_list);
|
||||
this.save();
|
||||
public void setLimitAmount(Integer amount, @Nullable World world) {
|
||||
if (world == null || !world_limits.containsKey(world.getName())) {
|
||||
world_limits.get("default").amount = amount;
|
||||
} 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) {
|
||||
this.price = price;
|
||||
this.config.set("Price", price);
|
||||
this.save();
|
||||
}
|
||||
|
||||
public void setPriceOnlyXZ(Boolean only_xz) {
|
||||
this.only_xz = only_xz;
|
||||
this.config.set("OnlyXZ", only_xz);
|
||||
this.save();
|
||||
}
|
||||
|
||||
public void setRefundRatio(Double refund) {
|
||||
this.refund = refund;
|
||||
this.config.set("Refund", refund);
|
||||
this.save();
|
||||
}
|
||||
|
||||
private void save() {
|
||||
if (file_path == null) {
|
||||
return;
|
||||
public void addWorldLimits(Map<String, WorldSetting> limits) {
|
||||
world_limits.putAll(limits);
|
||||
}
|
||||
try {
|
||||
config.save(file_path);
|
||||
} catch (Exception e) {
|
||||
XLogger.err("Failed to save group limit file: " + file_path.getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static Map<String, GroupLimit> loadGroups(JavaPlugin plugin) {
|
||||
Map<String, GroupLimit> groups = new HashMap<>();
|
||||
@ -238,4 +293,102 @@ public class GroupLimit {
|
||||
XLogger.info(Translation.Messages_LoadedGroupAmount, groups.size());
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package cn.lunadeer.dominion.managers;
|
||||
|
||||
import cn.lunadeer.dominion.Cache;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.dtos.GroupDTO;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||
@ -30,6 +31,13 @@ public class PlaceHolderApi extends PlaceholderExpansion {
|
||||
}
|
||||
return group.getNameColoredBukkit();
|
||||
}
|
||||
if (params.equalsIgnoreCase("current_dominion")) {
|
||||
DominionDTO dominion = Cache.instance.getDominionByLoc(bukkitPlayer.getLocation());
|
||||
if (dominion == null) {
|
||||
return "";
|
||||
}
|
||||
return dominion.getName();
|
||||
}
|
||||
return null; //
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
package cn.lunadeer.dominion.managers;
|
||||
|
||||
|
||||
import cn.lunadeer.dominion.dtos.Flag;
|
||||
import cn.lunadeer.minecraftpluginutils.i18n.Localization;
|
||||
import cn.lunadeer.minecraftpluginutils.i18n.i18n;
|
||||
import cn.lunadeer.minecraftpluginutils.i18n.i18nField;
|
||||
@ -147,31 +148,22 @@ public class Translation extends Localization {
|
||||
public static i18n Commands_Operator_ReloadingConfig;
|
||||
@i18nField(defaultValue = "配置文件已重新加载")
|
||||
public static i18n Commands_Operator_ReloadedConfig;
|
||||
|
||||
@i18nField(defaultValue = "最高Y坐标限制不能小于最低Y坐标限制")
|
||||
public static i18n Commands_SetConfig_MinYShouldBeLessThanMaxY;
|
||||
@i18nField(defaultValue = "最低Y坐标限制不能大于最高Y坐标限制")
|
||||
public static i18n Commands_SetConfig_MaxYShouldBeGreaterThanMinY;
|
||||
@i18nField(defaultValue = "X轴(东西)最大尺寸不能小于4")
|
||||
public static i18n Commands_SetConfig_SizeXShouldBeGreaterThan4;
|
||||
@i18nField(defaultValue = "Z轴(南北)最大尺寸不能小于4")
|
||||
public static i18n Commands_SetConfig_SizeZShouldBeGreaterThan4;
|
||||
@i18nField(defaultValue = "Y轴(垂直)最大尺寸不能小于4")
|
||||
public static i18n Commands_SetConfig_SizeYShouldBeGreaterThan4;
|
||||
@i18nField(defaultValue = "每个玩家领地数量限制不能小于0")
|
||||
public static i18n Commands_SetConfig_AmountShouldBeGreaterThan0;
|
||||
@i18nField(defaultValue = "领地深度限制不能小于0")
|
||||
public static i18n Commands_SetConfig_DepthShouldBeGreaterThan0;
|
||||
@i18nField(defaultValue = "传送延迟不能小于0")
|
||||
public static i18n Commands_SetConfig_TpDelayShouldBeGreaterThan0;
|
||||
@i18nField(defaultValue = "传送冷却时间不能小于0")
|
||||
public static i18n Commands_SetConfig_TpCoolDownShouldBeGreaterThan0;
|
||||
@i18nField(defaultValue = "每方块单价不能小于0")
|
||||
public static i18n Commands_SetConfig_PriceShouldBeGreaterThan0;
|
||||
@i18nField(defaultValue = "领地退款比例不能小于0")
|
||||
public static i18n Commands_SetConfig_RefundShouldBeGreaterThan0;
|
||||
@i18nField(defaultValue = "出生点保护半径不能小于或等于0")
|
||||
public static i18n Commands_SetConfig_SpawnProtectRadiusShouldBeGreaterThan0;
|
||||
@i18nField(defaultValue = "你正在尝试导出数据库表,此行为会踢出所有玩家并关闭服务器,如确认继续请输入 /dominion export_db confirm")
|
||||
public static i18n Commands_Operator_ExportDBConfirm;
|
||||
@i18nField(defaultValue = "正在导出数据库表...")
|
||||
public static i18n Commands_Operator_ExportDBBegin;
|
||||
@i18nField(defaultValue = "数据库表导出完成")
|
||||
public static i18n Commands_Operator_ExportDBSuccess;
|
||||
@i18nField(defaultValue = "你正在尝试导入数据库表,此行为会踢出所有玩家并关闭服务器,如确认继续请输入 /dominion import_db confirm")
|
||||
public static i18n Commands_Operator_ImportDBConfirm;
|
||||
@i18nField(defaultValue = "正在导入数据库表...")
|
||||
public static i18n Commands_Operator_ImportDBBegin;
|
||||
@i18nField(defaultValue = "数据库表导入完成")
|
||||
public static i18n Commands_Operator_ImportDBSuccess;
|
||||
@i18nField(defaultValue = "没有可导入的数据")
|
||||
public static i18n Commands_Operator_ImportDBFail;
|
||||
@i18nField(defaultValue = "导入失败,数据不完整,请重新导出文件")
|
||||
public static i18n Commands_Operator_ImportDBIncompleteFail;
|
||||
|
||||
@i18nField(defaultValue = "用法: /dominion template create <模板名称>")
|
||||
public static i18n Commands_Template_CreateTemplateUsage;
|
||||
@ -326,14 +318,18 @@ public class Translation extends Localization {
|
||||
public static i18n Messages_SetMapColorSuccess;
|
||||
@i18nField(defaultValue = "尺寸不合法")
|
||||
public static i18n Messages_SizeInvalid;
|
||||
@i18nField(defaultValue = "领地的任意一边长度不得小于4")
|
||||
public static i18n Messages_SizeShouldBeGreaterThan4;
|
||||
@i18nField(defaultValue = "领地X方向(东西)长度不能超过 %d")
|
||||
public static i18n Messages_SizeXShouldBeLessThan;
|
||||
@i18nField(defaultValue = "领地Y方向(上下)高度不能超过 %d")
|
||||
public static i18n Messages_SizeYShouldBeLessThan;
|
||||
@i18nField(defaultValue = "领地Z方向(南北)长度不能超过 %d")
|
||||
public static i18n Messages_SizeZShouldBeLessThan;
|
||||
@i18nField(defaultValue = "领地X方向(东西)长度不能少于 %d")
|
||||
public static i18n Messages_SizeXShouldBeGreaterThan;
|
||||
@i18nField(defaultValue = "领地Y方向(上下)高度不能少于 %d")
|
||||
public static i18n Messages_SizeYShouldBeGreaterThan;
|
||||
@i18nField(defaultValue = "领地Z方向(南北)长度不能少于 %d")
|
||||
public static i18n Messages_SizeZShouldBeGreaterThan;
|
||||
@i18nField(defaultValue = "领地Y坐标上限不能超过 %d")
|
||||
public static i18n Messages_MaxYShouldBeLessThan;
|
||||
@i18nField(defaultValue = "领地Y坐标下限不能超过 %d")
|
||||
@ -375,6 +371,8 @@ public class Translation extends Localization {
|
||||
public static i18n Messages_SetDominionFlagSuccess;
|
||||
@i18nField(defaultValue = "未知的权限 %s")
|
||||
public static i18n Messages_UnknownFlag;
|
||||
@i18nField(defaultValue = "你没有权限访问此页面")
|
||||
public static i18n Messages_PageNoPermission;
|
||||
|
||||
@i18nField(defaultValue = "创建权限组 %s 失败")
|
||||
public static i18n Messages_CreateGroupFailed;
|
||||
@ -501,6 +499,8 @@ public class Translation extends Localization {
|
||||
public static i18n Messages_PlaceholderAPIRegisterSuccess;
|
||||
@i18nField(defaultValue = "共加载了 %d 个领地组")
|
||||
public static i18n Messages_LoadedGroupAmount;
|
||||
@i18nField(defaultValue = "<div>%s</div><div>所有人:%s</div>")
|
||||
public static i18n Messages_MapInfoDetail;
|
||||
|
||||
@i18nField(defaultValue = "开始自动清理长时间未登录玩家领地数据")
|
||||
public static i18n Messages_AutoCleanStart;
|
||||
@ -516,6 +516,291 @@ public class Translation extends Localization {
|
||||
@i18nField(defaultValue = "<>表示必填参数 []表示可选参数")
|
||||
public static i18n TUI_CommandHelp_SubTitle;
|
||||
|
||||
@i18nField(defaultValue = "主菜单")
|
||||
public static i18n TUI_Navigation_Menu;
|
||||
@i18nField(defaultValue = "我的领地")
|
||||
public static i18n TUI_Navigation_DominionList;
|
||||
@i18nField(defaultValue = "管理界面")
|
||||
public static i18n TUI_Navigation_Manage;
|
||||
@i18nField(defaultValue = "环境设置")
|
||||
public static i18n TUI_Navigation_EnvSetting;
|
||||
@i18nField(defaultValue = "访客权限")
|
||||
public static i18n TUI_Navigation_GuestSetting;
|
||||
@i18nField(defaultValue = "成员列表")
|
||||
public static i18n TUI_Navigation_MemberList;
|
||||
@i18nField(defaultValue = "成员权限")
|
||||
public static i18n TUI_Navigation_MemberSetting;
|
||||
@i18nField(defaultValue = "权限组列表")
|
||||
public static i18n TUI_Navigation_GroupList;
|
||||
@i18nField(defaultValue = "权限组管理")
|
||||
public static i18n TUI_Navigation_GroupSetting;
|
||||
@i18nField(defaultValue = "所有领地")
|
||||
public static i18n TUI_Navigation_AllDominion;
|
||||
@i18nField(defaultValue = "模板列表")
|
||||
public static i18n TUI_Navigation_TemplateList;
|
||||
@i18nField(defaultValue = "模板管理")
|
||||
public static i18n TUI_Navigation_TemplateSetting;
|
||||
@i18nField(defaultValue = "Res数据列表")
|
||||
public static i18n TUI_Navigation_MigrateList;
|
||||
@i18nField(defaultValue = "权限组称号列表")
|
||||
public static i18n TUI_Navigation_TitleList;
|
||||
|
||||
@i18nField(defaultValue = "管理")
|
||||
public static i18n TUI_ManageButton;
|
||||
@i18nField(defaultValue = "删除")
|
||||
public static i18n TUI_DeleteButton;
|
||||
@i18nField(defaultValue = "搜索")
|
||||
public static i18n TUI_SearchButton;
|
||||
@i18nField(defaultValue = "返回")
|
||||
public static i18n TUI_BackButton;
|
||||
@i18nField(defaultValue = "选择")
|
||||
public static i18n TUI_SelectButton;
|
||||
@i18nField(defaultValue = "编辑")
|
||||
public static i18n TUI_EditButton;
|
||||
|
||||
@i18nField(defaultValue = "Dominion 领地系统")
|
||||
public static i18n TUI_Menu_Title;
|
||||
@i18nField(defaultValue = "创建领地")
|
||||
public static i18n TUI_Menu_CreateDominionButton;
|
||||
@i18nField(defaultValue = "以你为中心自动创建一个新的领地")
|
||||
public static i18n TUI_Menu_CreateDominionDescription;
|
||||
@i18nField(defaultValue = "我的领地")
|
||||
public static i18n TUI_Menu_MyDominionButton;
|
||||
@i18nField(defaultValue = "查看我的领地列表")
|
||||
public static i18n TUI_Menu_MyDominionDescription;
|
||||
@i18nField(defaultValue = "称号列表")
|
||||
public static i18n TUI_Menu_TitleListButton;
|
||||
@i18nField(defaultValue = "查看/使用权限组称号")
|
||||
public static i18n TUI_Menu_TitleListDescription;
|
||||
@i18nField(defaultValue = "模板列表")
|
||||
public static i18n TUI_Menu_TemplateListButton;
|
||||
@i18nField(defaultValue = "成员权限模板列表")
|
||||
public static i18n TUI_Menu_TemplateListDescription;
|
||||
@i18nField(defaultValue = "指令帮助")
|
||||
public static i18n TUI_Menu_CommandHelpButton;
|
||||
@i18nField(defaultValue = "查看指令列表")
|
||||
public static i18n TUI_Menu_CommandHelpDescription;
|
||||
@i18nField(defaultValue = "使用文档")
|
||||
public static i18n TUI_Menu_DocumentButton;
|
||||
@i18nField(defaultValue = "在浏览器中打开使用文档")
|
||||
public static i18n TUI_Menu_DocumentDescription;
|
||||
@i18nField(defaultValue = "迁移数据")
|
||||
public static i18n TUI_Menu_MigrateButton;
|
||||
@i18nField(defaultValue = "把你的领地从Residence迁移到Dominion")
|
||||
public static i18n TUI_Menu_MigrateDescription;
|
||||
@i18nField(defaultValue = "所有领地")
|
||||
public static i18n TUI_Menu_AllDominionButton;
|
||||
@i18nField(defaultValue = "查看所有领地")
|
||||
public static i18n TUI_Menu_AllDominionDescription;
|
||||
@i18nField(defaultValue = "重载缓存")
|
||||
public static i18n TUI_Menu_ReloadCacheButton;
|
||||
@i18nField(defaultValue = "手动刷新缓存可解决一些玩家操作无效问题,不建议频繁操作")
|
||||
public static i18n TUI_Menu_ReloadCacheDescription;
|
||||
@i18nField(defaultValue = "重载配置")
|
||||
public static i18n TUI_Menu_ReloadConfigButton;
|
||||
@i18nField(defaultValue = "重载配置文件")
|
||||
public static i18n TUI_Menu_ReloadConfigDescription;
|
||||
@i18nField(defaultValue = "--- 以下选项仅OP可见 ---")
|
||||
public static i18n TUI_Menu_OpOnlySection;
|
||||
|
||||
@i18nField(defaultValue = "我的领地列表")
|
||||
public static i18n TUI_DominionList_Title;
|
||||
@i18nField(defaultValue = "--- 以下为你拥有管理员权限的领地 ---")
|
||||
public static i18n TUI_DominionList_AdminSection;
|
||||
|
||||
@i18nField(defaultValue = "领地 %s 管理界面")
|
||||
public static i18n TUI_DominionManage_Title;
|
||||
@i18nField(defaultValue = "详细信息")
|
||||
public static i18n TUI_DominionManage_InfoButton;
|
||||
@i18nField(defaultValue = "查看领地详细信息")
|
||||
public static i18n TUI_DominionManage_InfoDescription;
|
||||
@i18nField(defaultValue = "环境设置")
|
||||
public static i18n TUI_DominionManage_EnvSettingButton;
|
||||
@i18nField(defaultValue = "设置领地内的一些环境行为")
|
||||
public static i18n TUI_DominionManage_EnvSettingDescription;
|
||||
@i18nField(defaultValue = "访客权限")
|
||||
public static i18n TUI_DominionManage_GuestSettingButton;
|
||||
@i18nField(defaultValue = "配置访客在此领地的权限")
|
||||
public static i18n TUI_DominionManage_GuestSettingDescription;
|
||||
@i18nField(defaultValue = "成员管理")
|
||||
public static i18n TUI_DominionManage_MemberListButton;
|
||||
@i18nField(defaultValue = "管理此领地成员的权限")
|
||||
public static i18n TUI_DominionManage_MemberListDescription;
|
||||
@i18nField(defaultValue = "权限组")
|
||||
public static i18n TUI_DominionManage_GroupListButton;
|
||||
@i18nField(defaultValue = "管理此领地的权限组")
|
||||
public static i18n TUI_DominionManage_GroupListDescription;
|
||||
@i18nField(defaultValue = "设置传送点")
|
||||
public static i18n TUI_DominionManage_SetTpLocationButton;
|
||||
@i18nField(defaultValue = "设置你当前位置为此领地传送点")
|
||||
public static i18n TUI_DominionManage_SetTpLocationDescription;
|
||||
@i18nField(defaultValue = "重命名")
|
||||
public static i18n TUI_DominionManage_RenameButton;
|
||||
@i18nField(defaultValue = "重命名领地")
|
||||
public static i18n TUI_DominionManage_RenameDescription;
|
||||
@i18nField(defaultValue = "编辑欢迎提示语")
|
||||
public static i18n TUI_DominionManage_EditJoinMessageButton;
|
||||
@i18nField(defaultValue = "当玩家进入领地时显示的消息")
|
||||
public static i18n TUI_DominionManage_EditJoinMessageDescription;
|
||||
@i18nField(defaultValue = "编辑离开提示语")
|
||||
public static i18n TUI_DominionManage_EditLeaveMessageButton;
|
||||
@i18nField(defaultValue = "当玩家离开领地时显示的消息")
|
||||
public static i18n TUI_DominionManage_EditLeaveMessageDescription;
|
||||
@i18nField(defaultValue = "设置地块颜色")
|
||||
public static i18n TUI_DominionManage_SetMapColorButton;
|
||||
@i18nField(defaultValue = "设置卫星地图上的地块颜色")
|
||||
public static i18n TUI_DominionManage_SetMapColorDescription;
|
||||
@i18nField(defaultValue = "你不在任何领地内,请指定领地名称 /dominion manage <领地名称>")
|
||||
public static i18n TUI_DominionManage_NotInDominion;
|
||||
|
||||
@i18nField(defaultValue = "领地 %s 环境设置")
|
||||
public static i18n TUI_EnvSetting_Title;
|
||||
@i18nField(defaultValue = "用法: /dominion env_setting <领地名称> [页码]")
|
||||
public static i18n TUI_EnvSetting_Usage;
|
||||
|
||||
@i18nField(defaultValue = "领地 %s 访客权限")
|
||||
public static i18n TUI_GuestSetting_Title;
|
||||
@i18nField(defaultValue = "用法: /dominion guest_setting <领地名称> [页码]")
|
||||
public static i18n TUI_GuestSetting_Usage;
|
||||
|
||||
@i18nField(defaultValue = "领地 %s 的尺寸信息")
|
||||
public static i18n TUI_SizeInfo_Title;
|
||||
@i18nField(defaultValue = "领地所有者:")
|
||||
public static i18n TUI_SizeInfo_Owner;
|
||||
@i18nField(defaultValue = "领地大小:")
|
||||
public static i18n TUI_SizeInfo_Size;
|
||||
@i18nField(defaultValue = "中心坐标:")
|
||||
public static i18n TUI_SizeInfo_Center;
|
||||
@i18nField(defaultValue = "垂直高度:")
|
||||
public static i18n TUI_SizeInfo_Vertical;
|
||||
@i18nField(defaultValue = "Y轴坐标:")
|
||||
public static i18n TUI_SizeInfo_VertY;
|
||||
@i18nField(defaultValue = "水平面积:")
|
||||
public static i18n TUI_SizeInfo_Square;
|
||||
@i18nField(defaultValue = "领地体积:")
|
||||
public static i18n TUI_SizeInfo_Volume;
|
||||
@i18nField(defaultValue = "传送点坐标:")
|
||||
public static i18n TUI_SizeInfo_TpLocation;
|
||||
@i18nField(defaultValue = "无")
|
||||
public static i18n TUI_SizeInfo_NoneTp;
|
||||
@i18nField(defaultValue = "你不在任何领地内,请指定领地名称 /dominion info <领地名称>")
|
||||
public static i18n TUI_SizeInfo_Usage;
|
||||
|
||||
@i18nField(defaultValue = "领地 %s 成员列表")
|
||||
public static i18n TUI_MemberList_Title;
|
||||
@i18nField(defaultValue = "添加成员")
|
||||
public static i18n TUI_MemberList_AddButton;
|
||||
@i18nField(defaultValue = "权限")
|
||||
public static i18n TUI_MemberList_FlagButton;
|
||||
@i18nField(defaultValue = "配置成员权限")
|
||||
public static i18n TUI_MemberList_FlagDescription;
|
||||
@i18nField(defaultValue = "移除")
|
||||
public static i18n TUI_MemberList_RemoveButton;
|
||||
@i18nField(defaultValue = "将此成员移出(变为访客)")
|
||||
public static i18n TUI_MemberList_RemoveDescription;
|
||||
@i18nField(defaultValue = "你不是领地主人,无法编辑管理员权限")
|
||||
public static i18n TUI_MemberList_NoPermissionSet;
|
||||
@i18nField(defaultValue = "你不是领地主人,无法移除管理员")
|
||||
public static i18n TUI_MemberList_NoPermissionRemove;
|
||||
@i18nField(defaultValue = "此成员属于权限组 %s 无法单独编辑权限")
|
||||
public static i18n TUI_MemberList_BelongToGroup;
|
||||
@i18nField(defaultValue = "用法: /dominion member list <领地名称> [页码]")
|
||||
public static i18n TUI_MemberList_Usage;
|
||||
@i18nField(defaultValue = "这是一个管理员")
|
||||
public static i18n TUI_MemberList_AdminTag;
|
||||
@i18nField(defaultValue = "这是一个普通成员")
|
||||
public static i18n TUI_MemberList_NormalTag;
|
||||
@i18nField(defaultValue = "这是一个黑名单成员")
|
||||
public static i18n TUI_MemberList_BlacklistTag;
|
||||
@i18nField(defaultValue = "这个成员在一个权限组里")
|
||||
public static i18n TUI_MemberList_GroupTag;
|
||||
|
||||
@i18nField(defaultValue = "玩家 %s 在领地 %s 的权限设置")
|
||||
public static i18n TUI_MemberSetting_Title;
|
||||
@i18nField(defaultValue = "套用模板")
|
||||
public static i18n TUI_MemberSetting_ApplyTemplateButton;
|
||||
@i18nField(defaultValue = "选择一个权限模板套用")
|
||||
public static i18n TUI_MemberSetting_ApplyTemplateDescription;
|
||||
@i18nField(defaultValue = "用法: /dominion member setting <领地名称> <玩家名称> [页码]")
|
||||
public static i18n TUI_MemberSetting_Usage;
|
||||
|
||||
@i18nField(defaultValue = "选择玩家添加为成员")
|
||||
public static i18n TUI_SelectPlayer_Title;
|
||||
@i18nField(defaultValue = "只能选择已经登录过的玩家")
|
||||
public static i18n TUI_SelectPlayer_Description;
|
||||
@i18nField(defaultValue = "用法: /dominion member select_player <领地名称> [页码]")
|
||||
public static i18n TUI_SelectPlayer_Usage;
|
||||
|
||||
@i18nField(defaultValue = "选择一个模板")
|
||||
public static i18n TUI_SelectTemplate_Title;
|
||||
@i18nField(defaultValue = "套用在领地 %s 的成员 %s 身上")
|
||||
public static i18n TUI_SelectTemplate_Description;
|
||||
@i18nField(defaultValue = "用法: /dominion member select_template <领地名称> <玩家名称> [页码]")
|
||||
public static i18n TUI_SelectTemplate_Usage;
|
||||
|
||||
@i18nField(defaultValue = "领地 %s 权限组列表")
|
||||
public static i18n TUI_GroupList_Title;
|
||||
@i18nField(defaultValue = "创建权限组")
|
||||
public static i18n TUI_GroupList_CreateButton;
|
||||
@i18nField(defaultValue = "创建一个新的权限组")
|
||||
public static i18n TUI_GroupList_CreateDescription;
|
||||
@i18nField(defaultValue = "删除权限组 %s")
|
||||
public static i18n TUI_GroupList_DeleteDescription;
|
||||
@i18nField(defaultValue = "编辑权限组 %s")
|
||||
public static i18n TUI_GroupList_EditDescription;
|
||||
@i18nField(defaultValue = "添加成员到权限组 %s")
|
||||
public static i18n TUI_GroupList_AddMemberDescription;
|
||||
@i18nField(defaultValue = "把 %s 移出权限组 %s")
|
||||
public static i18n TUI_GroupList_RemoveMemberDescription;
|
||||
@i18nField(defaultValue = "用法: /dominion group list <领地名称> [页码]")
|
||||
public static i18n TUI_GroupList_Usage;
|
||||
|
||||
@i18nField(defaultValue = "重命名此权限组")
|
||||
public static i18n TUI_GroupSetting_RenameButton;
|
||||
@i18nField(defaultValue = "用法: /dominion group setting <领地名称> <权限组名称> [页码]")
|
||||
public static i18n TUI_GroupSetting_Usage;
|
||||
@i18nField(defaultValue = "权限组 ")
|
||||
public static i18n TUI_GroupSetting_TitleL;
|
||||
@i18nField(defaultValue = " 管理")
|
||||
public static i18n TUI_GroupSetting_TitleR;
|
||||
@i18nField(defaultValue = "重命名权限组 %s")
|
||||
public static i18n TUI_GroupSetting_RenameDescription;
|
||||
|
||||
@i18nField(defaultValue = "选择成员")
|
||||
public static i18n TUI_SelectMember_Title;
|
||||
@i18nField(defaultValue = "选择成员添加到权限组 %s")
|
||||
public static i18n TUI_SelectMember_Description;
|
||||
@i18nField(defaultValue = "用法: /dominion group select_member <领地名称> <权限组名称> [回显页码] [页码]")
|
||||
public static i18n TUI_SelectMember_Usage;
|
||||
|
||||
@i18nField(defaultValue = "成员权限模板列表")
|
||||
public static i18n TUI_TemplateList_Title;
|
||||
@i18nField(defaultValue = "创建成员权限模板")
|
||||
public static i18n TUI_TemplateList_CreateButton;
|
||||
@i18nField(defaultValue = "创建一个新的成员权限模板")
|
||||
public static i18n TUI_TemplateList_CreateDescription;
|
||||
|
||||
@i18nField(defaultValue = "模板 %s 权限管理")
|
||||
public static i18n TUI_TemplateSetting_Title;
|
||||
|
||||
@i18nField(defaultValue = "从 Residence 迁移数据")
|
||||
public static i18n TUI_Migrate_Title;
|
||||
@i18nField(defaultValue = "你没有可迁移的数据")
|
||||
public static i18n TUI_Migrate_NoData;
|
||||
@i18nField(defaultValue = "迁移")
|
||||
public static i18n TUI_Migrate_Button;
|
||||
@i18nField(defaultValue = "子领地无法手动迁移,会随父领地自动迁移")
|
||||
public static i18n TUI_Migrate_SubDominion;
|
||||
|
||||
@i18nField(defaultValue = "我可使用的权限组称号")
|
||||
public static i18n TUI_TitleList_Title;
|
||||
@i18nField(defaultValue = "卸下")
|
||||
public static i18n TUI_TitleList_RemoveButton;
|
||||
@i18nField(defaultValue = "使用")
|
||||
public static i18n TUI_TitleList_ApplyButton;
|
||||
@i18nField(defaultValue = "来自领地:")
|
||||
public static i18n TUI_TitleList_FromDominion;
|
||||
|
||||
@i18nField(defaultValue = "输入要创建的领地名称")
|
||||
public static i18n CUI_Input_CreateDominion;
|
||||
@i18nField(defaultValue = "输入要创建的权限组名称")
|
||||
@ -537,49 +822,63 @@ public class Translation extends Localization {
|
||||
|
||||
@i18nField(defaultValue = "AutoCreateRadius 不能等于 0,已重置为 10")
|
||||
public static i18n Config_Check_AutoCreateRadiusError;
|
||||
@i18nField(defaultValue = "MessageDisplay 不能设置为 %s,已重置为 ACTION_BAR")
|
||||
public static i18n Config_Check_MessageDisplayError;
|
||||
@i18nField(defaultValue = "AutoCleanAfterDays 不能等于 0,已重置为 180")
|
||||
public static i18n Config_Check_AutoCleanAfterDaysError;
|
||||
@i18nField(defaultValue = "工具名称设置错误,已重置为 ARROW")
|
||||
@i18nField(defaultValue = "Tool 名称设置错误,已重置为 ARROW")
|
||||
public static i18n Config_Check_ToolNameError;
|
||||
@i18nField(defaultValue = "Limit.SizeX 尺寸不能小于 4,已重置为 128")
|
||||
public static i18n Config_Check_LimitSizeXError;
|
||||
@i18nField(defaultValue = "Limit.SizeY 尺寸不能小于 4,已重置为 64")
|
||||
public static i18n Config_Check_LimitSizeYError;
|
||||
@i18nField(defaultValue = "Limit.SizeZ 尺寸不能小于 4,已重置为 128")
|
||||
public static i18n Config_Check_LimitSizeZError;
|
||||
@i18nField(defaultValue = "Limit.MinY 不能大于或等于 Limit.MaxY,已重置为 -64 320")
|
||||
public static i18n Config_Check_LimitMinYError;
|
||||
@i18nField(defaultValue = "Economy.Refund 设置不合法,已重置为 0.85")
|
||||
public static i18n Config_Check_RefundError;
|
||||
@i18nField(defaultValue = "Economy.Price 设置不合法,已重置为 10.0")
|
||||
public static i18n Config_Check_PriceError;
|
||||
@i18nField(defaultValue = "启用 Limit.Vert 时 Limit.SizeY 不能小于 Limit.MaxY - Limit.MinY,已自动调整为 %d")
|
||||
public static i18n Config_Check_LimitSizeYAutoAdjust;
|
||||
@i18nField(defaultValue = "Limit.Amount 设置不合法,已重置为 10")
|
||||
public static i18n Config_Check_AmountError;
|
||||
@i18nField(defaultValue = "Limit.Depth 设置不合法,已重置为 3")
|
||||
public static i18n Config_Check_DepthError;
|
||||
@i18nField(defaultValue = "权限组 %s 的 MinY 不能大于等于 MaxY,已重置为 -64 和 320")
|
||||
@i18nField(defaultValue = "InfoTool 名称设置错误,已重置为 STRING")
|
||||
public static i18n Config_Check_InfoToolNameError;
|
||||
@i18nField(defaultValue = "%s 的 MinY 不能大于等于 MaxY,已重置为 -64 和 320")
|
||||
public static i18n Config_Check_GroupMinYError;
|
||||
@i18nField(defaultValue = "权限组 %s 的 SizeX 设置过小,已重置为 128")
|
||||
public static i18n Config_Check_GroupSizeXError;
|
||||
@i18nField(defaultValue = "权限组 %s 的 SizeY 设置过小,已重置为 64")
|
||||
public static i18n Config_Check_GroupSizeYError;
|
||||
@i18nField(defaultValue = "权限组 %s 的 SizeZ 设置过小,已重置为 128")
|
||||
public static i18n Config_Check_GroupSizeZError;
|
||||
@i18nField(defaultValue = "权限组 %s 的 Amount 设置不合法,已重置为 10")
|
||||
@i18nField(defaultValue = "%s 的 Size.MaxX 设置过小,已重置为 128")
|
||||
public static i18n Config_Check_GroupSizeMaxXError;
|
||||
@i18nField(defaultValue = "%s 的 Size.MaxY 设置过小,已重置为 64")
|
||||
public static i18n Config_Check_GroupSizeMaxYError;
|
||||
@i18nField(defaultValue = "%s 的 Size.MaxZ 设置过小,已重置为 128")
|
||||
public static i18n Config_Check_GroupSizeMaxZError;
|
||||
@i18nField(defaultValue = "%s 的 Size.MinX 设置过小,已重置为 4")
|
||||
public static i18n Config_Check_GroupSizeMinXError;
|
||||
@i18nField(defaultValue = "%s 的 Size.MinY 设置过小,已重置为 4")
|
||||
public static i18n Config_Check_GroupSizeMinYError;
|
||||
@i18nField(defaultValue = "%s 的 Size.MinZ 设置过小,已重置为 4")
|
||||
public static i18n Config_Check_GroupSizeMinZError;
|
||||
@i18nField(defaultValue = "%s 的 Size.MaxX 不能小于 MinX,已重置为 128 和 4")
|
||||
public static i18n Config_Check_GroupMaxMinXError;
|
||||
@i18nField(defaultValue = "%s 的 Size.MinY 不能小于 MinY,已重置为 64 和 4")
|
||||
public static i18n Config_Check_GroupMaxMinYError;
|
||||
@i18nField(defaultValue = "%s 的 Size.MaxZ 不能小于 MinZ,已重置为 128 和 4")
|
||||
public static i18n Config_Check_GroupMaxMinZError;
|
||||
@i18nField(defaultValue = "%s 的 Amount 设置不合法,已重置为 10")
|
||||
public static i18n Config_Check_GroupAmountError;
|
||||
@i18nField(defaultValue = "权限组 %s 的 Depth 设置不合法,已重置为 3")
|
||||
@i18nField(defaultValue = "%s 的 Depth 设置不合法,已重置为 3")
|
||||
public static i18n Config_Check_GroupDepthError;
|
||||
@i18nField(defaultValue = "权限组 %s 的 Price 设置不合法,已重置为 10.0")
|
||||
@i18nField(defaultValue = "%s 的 Price 设置不合法,已重置为 10.0")
|
||||
public static i18n Config_Check_GroupPriceError;
|
||||
@i18nField(defaultValue = "权限组 %s 的 Refund 设置不合法,已重置为 0.85")
|
||||
@i18nField(defaultValue = "%s 的 Refund 设置不合法,已重置为 0.85")
|
||||
public static i18n Config_Check_GroupRefundError;
|
||||
@i18nField(defaultValue = "读取权限配置失败:%s")
|
||||
public static i18n Config_Check_LoadFlagError;
|
||||
@i18nField(defaultValue = "传送延迟不能小于 0,已重置为 0")
|
||||
public static i18n Config_Check_TpDelayError;
|
||||
@i18nField(defaultValue = "传送冷却不能小于 0,已重置为 0")
|
||||
public static i18n Config_Check_TpCoolDownError;
|
||||
|
||||
@i18nField(defaultValue = "语言设置,参考 languages 文件夹下的文件名")
|
||||
public static i18n Config_Comment_Language;
|
||||
@i18nField(defaultValue = "自动创建领地的半径,单位为方块")
|
||||
public static i18n Config_Comment_AutoCreateRadius;
|
||||
@i18nField(defaultValue = "默认进入领地提示消息")
|
||||
public static i18n Config_Comment_DefaultJoinMessage;
|
||||
@i18nField(defaultValue = "默认离开领地提示消息")
|
||||
public static i18n Config_Comment_DefaultLeaveMessage;
|
||||
@i18nField(defaultValue = "提示消息显示位置(BOSS_BAR, ACTION_BAR, TITLE, SUBTITLE, CHAT)")
|
||||
public static i18n Config_Comment_MessageDisplay;
|
||||
@i18nField(defaultValue = "玩家没有权限时的提示消息位置")
|
||||
public static i18n Config_Comment_MessageDisplayNoPermission;
|
||||
@i18nField(defaultValue = "进入/离开领地时的提示消息位置")
|
||||
public static i18n Config_Comment_MessageDisplayJoinLeave;
|
||||
@i18nField(defaultValue = "-1表示不开启")
|
||||
public static i18n Config_Comment_NegativeOneDisabled;
|
||||
@i18nField(defaultValue = "默认玩家圈地限制")
|
||||
@ -593,11 +892,17 @@ public class Translation extends Localization {
|
||||
@i18nField(defaultValue = "-1表示不限制")
|
||||
public static i18n Config_Comment_NegativeOneUnlimited;
|
||||
@i18nField(defaultValue = "X方向最大长度")
|
||||
public static i18n Config_Comment_SizeX;
|
||||
public static i18n Config_Comment_SizeMaxX;
|
||||
@i18nField(defaultValue = "Y方向最大长度")
|
||||
public static i18n Config_Comment_SizeY;
|
||||
public static i18n Config_Comment_SizeMaxY;
|
||||
@i18nField(defaultValue = "Z方向最大长度")
|
||||
public static i18n Config_Comment_SizeZ;
|
||||
public static i18n Config_Comment_SizeMaxZ;
|
||||
@i18nField(defaultValue = "X方向最小长度")
|
||||
public static i18n Config_Comment_SizeMinX;
|
||||
@i18nField(defaultValue = "Y方向最小长度")
|
||||
public static i18n Config_Comment_SizeMinY;
|
||||
@i18nField(defaultValue = "Z方向最小长度")
|
||||
public static i18n Config_Comment_SizeMinZ;
|
||||
@i18nField(defaultValue = "最大领地数量")
|
||||
public static i18n Config_Comment_Amount;
|
||||
@i18nField(defaultValue = "子领地深度")
|
||||
@ -606,10 +911,10 @@ public class Translation extends Localization {
|
||||
public static i18n Config_Comment_ZeroDisabled;
|
||||
@i18nField(defaultValue = "是否自动延伸到 MaxY 和 MinY")
|
||||
public static i18n Config_Comment_Vert;
|
||||
@i18nField(defaultValue = "不允许圈地的世界列表")
|
||||
public static i18n Config_Comment_DisabledWorlds;
|
||||
@i18nField(defaultValue = "是否允许OP无视领地限制")
|
||||
public static i18n Config_Comment_OpBypass;
|
||||
@i18nField(defaultValue = "单独设置某个世界的圈地规则(如不设置则使用以上规则)")
|
||||
public static i18n Config_Comment_WorldSettings;
|
||||
@i18nField(defaultValue = "传送延迟 秒")
|
||||
public static i18n Config_Comment_TpDelay;
|
||||
@i18nField(defaultValue = "传送冷却 秒")
|
||||
@ -618,6 +923,8 @@ public class Translation extends Localization {
|
||||
public static i18n Config_Comment_AutoCleanAfterDays;
|
||||
@i18nField(defaultValue = "圈地工具名称")
|
||||
public static i18n Config_Comment_ToolName;
|
||||
@i18nField(defaultValue = "查询领地信息工具名称")
|
||||
public static i18n Config_Comment_InfoToolName;
|
||||
@i18nField(defaultValue = "经济设置")
|
||||
public static i18n Config_Comment_Economy;
|
||||
@i18nField(defaultValue = "需要安装 Vault 前置及插件")
|
||||
@ -640,9 +947,78 @@ public class Translation extends Localization {
|
||||
public static i18n Config_Comment_GroupTitleColor;
|
||||
@i18nField(defaultValue = "性能测试计时器")
|
||||
public static i18n Config_Comment_PerformanceTimer;
|
||||
@i18nField(defaultValue = ">---------------------------------<")
|
||||
public static i18n Config_Comment_GroupLine1;
|
||||
@i18nField(defaultValue = "| 圈地限制特殊权限组配置 |")
|
||||
public static i18n Config_Comment_GroupLine2;
|
||||
@i18nField(defaultValue = ">---------------------------------<")
|
||||
public static i18n Config_Comment_GroupLine3;
|
||||
@i18nField(defaultValue = "此文件可以作为模板,你可以将此文件复制后重命名为你想要的")
|
||||
public static i18n Config_Comment_GroupLine4;
|
||||
@i18nField(defaultValue = "权限组名,然后修改里面的配置如果你想给赞助玩家(或者VIP)")
|
||||
public static i18n Config_Comment_GroupLine5;
|
||||
@i18nField(defaultValue = "一些特殊优惠,例如更少的圈地价格、更大的领地等,你可以在")
|
||||
public static i18n Config_Comment_GroupLine6;
|
||||
@i18nField(defaultValue = "这里配置。详细说明参阅以下链接:")
|
||||
public static i18n Config_Comment_GroupLine7;
|
||||
@i18nField(defaultValue = "> https://dominion.lunadeer.cn/%s/operator/privilege.html")
|
||||
public static i18n Config_Comment_GroupLine8DocumentAddress;
|
||||
|
||||
@i18nField(defaultValue = "管理员")
|
||||
public static i18n Flags_admin_DisplayName;
|
||||
@i18nField(defaultValue = "管理领地内的其他成员权限")
|
||||
public static i18n Flags_admin_Description;
|
||||
|
||||
@i18nField(defaultValue = "已选择第一个点: %d %d %d")
|
||||
public static i18n Tool_SelectFirstPoint;
|
||||
@i18nField(defaultValue = "已选择第二个点: %d %d %d")
|
||||
public static i18n Tool_SelectSecondPoint;
|
||||
@i18nField(defaultValue = "两个点不在同一个世界")
|
||||
public static i18n Tool_NotSameWorld;
|
||||
@i18nField(defaultValue = "已选择两个点,可以使用 /dominion create <领地名称> 创建领地")
|
||||
public static i18n Tool_SelectTwoPoints;
|
||||
@i18nField(defaultValue = "预计领地创建价格为 %.2f %s")
|
||||
public static i18n Tool_CreateDominionPrice;
|
||||
@i18nField(defaultValue = "尺寸: %d x %d x %d")
|
||||
public static i18n Tool_DominionSize;
|
||||
@i18nField(defaultValue = "面积: %d")
|
||||
public static i18n Tool_DominionSquare;
|
||||
@i18nField(defaultValue = "体积: %d")
|
||||
public static i18n Tool_DominionVolume;
|
||||
@i18nField(defaultValue = "高度: %d")
|
||||
public static i18n Tool_DominionHeight;
|
||||
@i18nField(defaultValue = "这个方块(%d, %d, %d)不在任何领地内")
|
||||
public static i18n Tool_LocationNotInDominion;
|
||||
@i18nField(defaultValue = "这个方块(%d, %d, %d)在领地 %s 内")
|
||||
public static i18n Tool_LocationInDominion;
|
||||
@i18nField(defaultValue = "领地主人: %s")
|
||||
public static i18n Tool_DominionOwner;
|
||||
|
||||
|
||||
public Translation(JavaPlugin plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
public void loadOrSetFlagTranslation(Flag flag) {
|
||||
String displayNameTranslation = loadOrSet(flag.getDisplayNameKey(), flag.getDisplayName());
|
||||
String descriptionTranslation = loadOrSet(flag.getDescriptionKey(), flag.getDescription());
|
||||
flag.setDisplayName(displayNameTranslation);
|
||||
flag.setDescription(descriptionTranslation);
|
||||
}
|
||||
|
||||
public void saveFlagTranslation(Flag flag) {
|
||||
set(flag.getDisplayNameKey(), flag.getDisplayName());
|
||||
set(flag.getDescriptionKey(), flag.getDescription());
|
||||
}
|
||||
|
||||
public void loadFlagTranslation(Flag flag) {
|
||||
String displayNameTranslation = load(flag.getDisplayNameKey());
|
||||
if (displayNameTranslation != null) {
|
||||
flag.setDisplayName(displayNameTranslation);
|
||||
}
|
||||
String descriptionTranslation = load(flag.getDescriptionKey());
|
||||
if (descriptionTranslation != null) {
|
||||
flag.setDescription(descriptionTranslation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -1,10 +1,10 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.AbstractOperator;
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.DominionController;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
|
||||
import org.bukkit.Location;
|
||||
@ -34,7 +34,7 @@ public class CreateDominion {
|
||||
Map<Integer, Location> points = autoPoints(sender);
|
||||
operator.getResponse().thenAccept(result -> {
|
||||
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));
|
@ -1,10 +1,10 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.GroupController;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupList;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupList;
|
||||
import cn.lunadeer.minecraftpluginutils.ColorParser;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
@ -1,9 +1,9 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.TemplateController;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.template.TemplateList;
|
||||
import cn.lunadeer.dominion.uis.tuis.template.TemplateList;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
|
||||
import org.bukkit.command.CommandSender;
|
@ -1,10 +1,10 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.DominionController;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
|
@ -1,10 +1,10 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.DominionController;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
|
@ -1,12 +1,12 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.AbstractOperator;
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.MemberController;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.member.MemberList;
|
||||
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.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
|
@ -1,9 +1,9 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.DominionController;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
|
||||
import org.bukkit.command.CommandSender;
|
@ -1,10 +1,10 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.GroupController;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.manage.group.GroupSetting;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.manage.group.GroupSetting;
|
||||
import cn.lunadeer.minecraftpluginutils.ColorParser;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
@ -1,10 +1,10 @@
|
||||
package cn.lunadeer.dominion.cuis;
|
||||
package cn.lunadeer.dominion.uis.cuis;
|
||||
|
||||
import cn.lunadeer.dominion.controllers.BukkitPlayerOperator;
|
||||
import cn.lunadeer.dominion.controllers.DominionController;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.dominion.uis.tuis.dominion.DominionManage;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
import cn.lunadeer.minecraftpluginutils.scui.CuiTextInput;
|
@ -1,7 +1,8 @@
|
||||
package cn.lunadeer.dominion.tuis;
|
||||
package cn.lunadeer.dominion.uis.tuis;
|
||||
|
||||
import cn.lunadeer.dominion.DominionNode;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
|
||||
@ -10,7 +11,7 @@ import org.bukkit.entity.Player;
|
||||
|
||||
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.TuiUtils.getPage;
|
||||
import static cn.lunadeer.dominion.utils.TuiUtils.notOp;
|
||||
@ -27,8 +28,8 @@ public class AllDominion {
|
||||
|
||||
ListView view = ListView.create(10, "/dominion all_dominion");
|
||||
|
||||
view.title("所有领地");
|
||||
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("所有领地"));
|
||||
view.title(Translation.TUI_Navigation_AllDominion);
|
||||
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.showOn(player, page);
|
||||
}
|
83
core/src/main/java/cn/lunadeer/dominion/uis/tuis/Menu.java
Normal file
83
core/src/main/java/cn/lunadeer/dominion/uis/tuis/Menu.java
Normal 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);
|
||||
}
|
||||
}
|
@ -1,18 +1,14 @@
|
||||
package cn.lunadeer.dominion.tuis;
|
||||
package cn.lunadeer.dominion.uis.tuis;
|
||||
|
||||
import cn.lunadeer.dominion.Cache;
|
||||
import cn.lunadeer.dominion.Dominion;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.utils.ResMigration;
|
||||
import cn.lunadeer.dominion.utils.TuiUtils;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.format.Style;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@ -28,7 +24,7 @@ public class MigrateList {
|
||||
if (player == null) return;
|
||||
|
||||
if (!Dominion.config.getResidenceMigration()) {
|
||||
Notification.error(sender, "Residence 迁移功能没有开启");
|
||||
Notification.error(sender, Translation.Commands_Residence_MigrationDisabled);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -36,13 +32,13 @@ public class MigrateList {
|
||||
|
||||
ListView view = ListView.create(10, "/dominion migrate_list");
|
||||
|
||||
view.title("从 Residence 迁移数据");
|
||||
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("Res数据"));
|
||||
view.title(Translation.TUI_Migrate_Title);
|
||||
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());
|
||||
|
||||
if (res_data == null) {
|
||||
view.add(Line.create().append("你没有可迁移的数据"));
|
||||
view.add(Line.create().append(Translation.TUI_Migrate_NoData));
|
||||
} else {
|
||||
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) {
|
||||
List<Line> lines = new ArrayList<>();
|
||||
StringBuilder prefix = new StringBuilder();
|
||||
for (int i = 0; i < depth; i++) {
|
||||
prefix.append(" | ");
|
||||
}
|
||||
prefix.append(" | ".repeat(Math.max(0, depth)));
|
||||
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();
|
||||
if (depth == 0) {
|
||||
line.append(migrate);
|
||||
line.append(migrate.build());
|
||||
} else {
|
||||
line.append(Component.text("[迁移]",
|
||||
Style.style(TextColor.color(190, 190, 190),
|
||||
TextDecoration.STRIKETHROUGH))
|
||||
.hoverEvent(Component.text("子领地无法手动迁移,会随父领地自动迁移")));
|
||||
line.append(migrate.setDisabled(Translation.TUI_Migrate_SubDominion).build());
|
||||
}
|
||||
line.append(prefix + node.name);
|
||||
lines.add(line);
|
@ -1,8 +1,9 @@
|
||||
package cn.lunadeer.dominion.tuis;
|
||||
package cn.lunadeer.dominion.uis.tuis;
|
||||
|
||||
import cn.lunadeer.dominion.Cache;
|
||||
import cn.lunadeer.dominion.dtos.DominionDTO;
|
||||
import cn.lunadeer.dominion.dtos.GroupDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
|
||||
@ -26,8 +27,8 @@ public class TitleList {
|
||||
int page = getPage(args, 1);
|
||||
ListView view = ListView.create(10, "/dominion title_list");
|
||||
|
||||
view.title("我可使用的权限组称号");
|
||||
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("权限组称号列表"));
|
||||
view.title(Translation.TUI_TitleList_Title);
|
||||
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());
|
||||
GroupDTO using = Cache.instance.getPlayerUsingGroupTitle(player.getUniqueId());
|
||||
@ -43,11 +44,11 @@ public class TitleList {
|
||||
DominionDTO dominion = Cache.instance.getDominion(group.getDomID());
|
||||
Line line = Line.create();
|
||||
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 {
|
||||
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);
|
||||
}
|
||||
|
@ -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.dtos.DominionDTO;
|
||||
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;
|
||||
@ -25,16 +26,18 @@ public class DominionList {
|
||||
int page = getPage(args, 1);
|
||||
ListView view = ListView.create(10, "/dominion list");
|
||||
|
||||
view.title("我的领地列表");
|
||||
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("我的领地"));
|
||||
view.title(Translation.TUI_DominionList_Title);
|
||||
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));
|
||||
List<String> admin_dominions = playerAdminDominions(sender);
|
||||
if (!admin_dominions.isEmpty()) {
|
||||
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) {
|
||||
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.showOn(player, page);
|
||||
@ -45,8 +48,8 @@ public class DominionList {
|
||||
StringBuilder prefix = new StringBuilder();
|
||||
prefix.append(" | ".repeat(Math.max(0, depth)));
|
||||
for (DominionNode node : dominionTree) {
|
||||
TextComponent manage = Button.createGreen("管理").setExecuteCommand("/dominion manage " + node.getDominion().getName()).build();
|
||||
TextComponent delete = Button.createRed("删除").setExecuteCommand("/dominion delete " + node.getDominion().getName()).build();
|
||||
TextComponent manage = Button.createGreen(Translation.TUI_ManageButton).setExecuteCommand("/dominion manage " + 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());
|
||||
lines.add(line);
|
||||
lines.addAll(BuildTreeLines(node.getChildren(), depth + 1));
|
@ -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);
|
||||
}
|
||||
}
|
@ -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.Flag;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
@ -17,25 +18,25 @@ public class EnvSetting {
|
||||
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 2) {
|
||||
Notification.error(sender, "用法: /dominion env_setting <领地名称> [页码]");
|
||||
Notification.error(sender, Translation.TUI_EnvSetting_Usage);
|
||||
return;
|
||||
}
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
DominionDTO dominion = DominionDTO.select(args[1]);
|
||||
if (dominion == null) {
|
||||
Notification.error(sender, "领地 %s 不存在", args[1]);
|
||||
Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
|
||||
return;
|
||||
}
|
||||
int page = getPage(args, 2);
|
||||
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()
|
||||
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append("环境设置"));
|
||||
for (Flag flag : Flag.getDominionOnlyFlagsEnabled()) {
|
||||
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append(Translation.TUI_Navigation_EnvSetting));
|
||||
for (Flag flag : Flag.getEnvironmentFlagsEnabled()) {
|
||||
view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page));
|
||||
}
|
||||
view.showOn(player, page);
|
@ -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.Flag;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
@ -17,24 +18,24 @@ public class GuestSetting {
|
||||
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 2) {
|
||||
Notification.error(sender, "用法: /dominion guest_setting <领地名称> [页码]");
|
||||
Notification.error(sender, Translation.TUI_GuestSetting_Usage);
|
||||
return;
|
||||
}
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
DominionDTO dominion = DominionDTO.select(args[1]);
|
||||
if (dominion == null) {
|
||||
Notification.error(sender, "领地 %s 不存在", args[1]);
|
||||
Notification.error(sender, Translation.Messages_DominionNotExist, args[1]);
|
||||
return;
|
||||
}
|
||||
int page = getPage(args, 2);
|
||||
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()
|
||||
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append("访客权限"));
|
||||
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append(Translation.TUI_Navigation_GuestSetting));
|
||||
for (Flag flag : Flag.getPrivilegeFlagsEnabled()) {
|
||||
view.add(createOption(flag, dominion.getFlagValue(flag), dominion.getName(), page));
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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.GroupDTO;
|
||||
import cn.lunadeer.dominion.dtos.MemberDTO;
|
||||
import cn.lunadeer.dominion.dtos.PlayerDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.utils.TuiUtils;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.XLogger;
|
||||
@ -31,45 +32,45 @@ public class GroupList {
|
||||
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 3) {
|
||||
Notification.error(sender, "用法: /dominion group list <领地名称> [页码]");
|
||||
Notification.error(sender, Translation.TUI_GroupList_Usage);
|
||||
return;
|
||||
}
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
DominionDTO dominion = DominionDTO.select(args[2]);
|
||||
if (dominion == null) {
|
||||
Notification.error(sender, "领地 %s 不存在", args[2]);
|
||||
Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
|
||||
return;
|
||||
}
|
||||
if (noAuthToManage(player, dominion)) return;
|
||||
int page = TuiUtils.getPage(args, 3);
|
||||
List<GroupDTO> groups = GroupDTO.selectByDominionId(dominion.getId());
|
||||
ListView view = ListView.create(10, "/dominion group list " + dominion.getName());
|
||||
view.title("权限组列表");
|
||||
view.title(String.format(Translation.TUI_GroupList_Title.trans(), dominion.getName()));
|
||||
view.navigator(
|
||||
Line.create()
|
||||
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append("权限组列表")
|
||||
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append(Translation.TUI_Navigation_GroupList)
|
||||
);
|
||||
|
||||
Button create_btn = Button.createGreen("创建权限组")
|
||||
.setHoverText("创建一个新的权限组")
|
||||
Button create_btn = Button.createGreen(Translation.TUI_GroupList_CreateButton)
|
||||
.setHoverText(Translation.TUI_GroupList_CreateDescription)
|
||||
.setExecuteCommand("/dominion cui_create_group " + dominion.getName());
|
||||
view.add(new Line().append(create_btn.build()));
|
||||
|
||||
for (GroupDTO group : groups) {
|
||||
Line line = new Line();
|
||||
Button del = Button.createRed("删除")
|
||||
.setHoverText("删除权限组 " + group.getName())
|
||||
.setExecuteCommand("/dominion group delete " + dominion.getName() + " " + group.getName());
|
||||
Button edit = Button.create("编辑")
|
||||
.setHoverText("编辑权限组 " + group.getName())
|
||||
.setExecuteCommand("/dominion group setting " + dominion.getName() + " " + group.getName());
|
||||
Button del = Button.createRed(Translation.TUI_DeleteButton)
|
||||
.setHoverText(String.format(Translation.TUI_GroupList_DeleteDescription.trans(), group.getNamePlain()))
|
||||
.setExecuteCommand("/dominion group delete " + dominion.getName() + " " + group.getNamePlain());
|
||||
Button edit = Button.create(Translation.TUI_EditButton)
|
||||
.setHoverText(String.format(Translation.TUI_GroupList_EditDescription.trans(), group.getNamePlain()))
|
||||
.setExecuteCommand("/dominion group setting " + dominion.getName() + " " + group.getNamePlain());
|
||||
Button add = Button.createGreen("+")
|
||||
.setHoverText("添加成员到权限组 " + group.getName())
|
||||
.setExecuteCommand("/dominion group select_member " + dominion.getName() + " " + group.getName() + " " + page);
|
||||
.setHoverText(String.format(Translation.TUI_GroupList_AddMemberDescription.trans(), group.getNamePlain()))
|
||||
.setExecuteCommand("/dominion group select_member " + dominion.getName() + " " + group.getNamePlain() + " " + page);
|
||||
line.append(del.build()).append(edit.build()).append(group.getNameColoredComponent()).append(add.build());
|
||||
view.add(line);
|
||||
List<MemberDTO> players = MemberDTO.selectByGroupId(group.getId());
|
||||
@ -78,8 +79,10 @@ public class GroupList {
|
||||
PlayerDTO p = PlayerDTO.select(playerPrivilege.getPlayerUUID());
|
||||
if (p == null) continue;
|
||||
Button remove = Button.createRed("-")
|
||||
.setHoverText("把 " + p.getLastKnownName() + " 移出权限组 " + group.getName())
|
||||
.setExecuteCommand("/dominion group remove_member " + dominion.getName() + " " + group.getName() + " " + p.getLastKnownName() + " " + page);
|
||||
.setHoverText(
|
||||
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("");
|
||||
playerLine.append(Component.text(" "));
|
||||
playerLine.append(remove.build()).append(" | " + p.getLastKnownName());
|
@ -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.Flag;
|
||||
import cn.lunadeer.dominion.dtos.GroupDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.dominion.utils.TuiUtils;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
@ -26,54 +27,62 @@ public class GroupSetting {
|
||||
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 4) {
|
||||
Notification.error(sender, "用法: /dominion group setting <领地名称> <权限组名称> [页码]");
|
||||
Notification.error(sender, Translation.TUI_GroupSetting_Usage);
|
||||
return;
|
||||
}
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
DominionDTO dominion = DominionDTO.select(args[2]);
|
||||
if (dominion == null) {
|
||||
Notification.error(sender, "领地 %s 不存在", args[2]);
|
||||
Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
|
||||
return;
|
||||
}
|
||||
if (noAuthToManage(player, dominion)) return;
|
||||
int page = TuiUtils.getPage(args, 4);
|
||||
GroupDTO group = GroupDTO.select(dominion.getId(), args[3]);
|
||||
if (group == null) {
|
||||
Notification.error(sender, "权限组 %s 不存在", args[3]);
|
||||
Notification.error(sender, Translation.Messages_GroupNotExist, args[2], args[3]);
|
||||
return;
|
||||
}
|
||||
|
||||
ListView view = ListView.create(10, "/dominion group setting " + dominion.getName() + " " + group.getName());
|
||||
view.title(Component.text("权限组 ").append(group.getNameColoredComponent()).append(Component.text(" 管理")));
|
||||
ListView view = ListView.create(10, "/dominion group setting " + dominion.getName() + " " + group.getNamePlain());
|
||||
view.title(Component.text(Translation.TUI_GroupSetting_TitleL.trans())
|
||||
.append(group.getNameColoredComponent())
|
||||
.append(Component.text(Translation.TUI_GroupSetting_TitleR.trans())));
|
||||
view.navigator(
|
||||
Line.create()
|
||||
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append(Button.create("权限组列表").setExecuteCommand("/dominion group list " + dominion.getName()).build())
|
||||
.append("权限组管理")
|
||||
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append(Button.create(Translation.TUI_Navigation_GroupList).setExecuteCommand("/dominion group list " + dominion.getName()).build())
|
||||
.append(Translation.TUI_Navigation_GroupSetting)
|
||||
);
|
||||
Button rename_btn = Button.create("重命名此权限组")
|
||||
.setHoverText("重命名权限组 " + group.getName())
|
||||
.setExecuteCommand("/dominion cui_rename_group " + dominion.getName() + " " + group.getName());
|
||||
Button rename_btn = Button.create(Translation.TUI_GroupSetting_RenameButton)
|
||||
.setHoverText(String.format(Translation.TUI_GroupSetting_RenameDescription.trans(), group.getNamePlain()))
|
||||
.setExecuteCommand("/dominion cui_rename_group " + dominion.getName() + " " + group.getNamePlain());
|
||||
view.add(Line.create().append(rename_btn.build()));
|
||||
|
||||
if (group.getAdmin()) {
|
||||
view.add(Line.create()
|
||||
.append(Button.createGreen("☑")
|
||||
.setExecuteCommand(parseCommand(dominion.getName(), group.getName(), "admin", false, page))
|
||||
.setExecuteCommand(parseCommand(dominion.getName(), group.getNamePlain(), "admin", false, page))
|
||||
.build())
|
||||
.append("管理员"));
|
||||
view.add(createOption(Flag.GLOW, group.getFlagValue(Flag.GLOW), dominion.getName(), group.getName(), page));
|
||||
.append(
|
||||
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 {
|
||||
view.add(Line.create()
|
||||
.append(Button.createRed("☐")
|
||||
.setExecuteCommand(parseCommand(dominion.getName(), group.getName(), "admin", true, page))
|
||||
.setExecuteCommand(parseCommand(dominion.getName(), group.getNamePlain(), "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()) {
|
||||
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);
|
@ -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.GroupDTO;
|
||||
import cn.lunadeer.dominion.dtos.MemberDTO;
|
||||
import cn.lunadeer.dominion.dtos.PlayerDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
@ -20,28 +21,28 @@ import static cn.lunadeer.dominion.utils.TuiUtils.noAuthToManage;
|
||||
public class SelectMember {
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 4) {
|
||||
Notification.error(sender, "用法: /dominion group select_member <领地名称> <权限组名称> [回显页码] [页码]");
|
||||
Notification.error(sender, Translation.TUI_SelectMember_Usage);
|
||||
return;
|
||||
}
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
DominionDTO dominion = DominionDTO.select(args[2]);
|
||||
if (dominion == null) {
|
||||
Notification.error(sender, "领地 %s 不存在", args[2]);
|
||||
Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
|
||||
return;
|
||||
}
|
||||
if (noAuthToManage(player, dominion)) return;
|
||||
GroupDTO group = GroupDTO.select(dominion.getId(), args[3]);
|
||||
if (group == null) {
|
||||
Notification.error(sender, "权限组不存在");
|
||||
Notification.error(sender, Translation.Messages_GroupNotExist, args[2], args[3]);
|
||||
return;
|
||||
}
|
||||
int backPage = getPage(args, 4);
|
||||
int page = getPage(args, 5);
|
||||
ListView view = ListView.create(10, "/dominion group select_member " + dominion.getName() + " " + group.getName() + " " + backPage);
|
||||
view.title("选择成员");
|
||||
Line sub = Line.create().append("选择成员添加到权限组 " + group.getName())
|
||||
.append(Button.create("返回").setExecuteCommand("/dominion group list " + dominion.getName() + " " + backPage).build());
|
||||
ListView view = ListView.create(10, "/dominion group select_member " + dominion.getName() + " " + group.getNamePlain() + " " + backPage);
|
||||
view.title(Translation.TUI_SelectMember_Title);
|
||||
Line sub = Line.create().append(String.format(Translation.TUI_SelectMember_Description.trans(), group.getNamePlain()))
|
||||
.append(Button.create(Translation.TUI_BackButton).setExecuteCommand("/dominion group list " + dominion.getName() + " " + backPage).build());
|
||||
view.subtitle(sub);
|
||||
List<MemberDTO> members = MemberDTO.selectByDomGroupId(dominion.getId(), -1);
|
||||
for (MemberDTO member : members) {
|
||||
@ -49,7 +50,7 @@ public class SelectMember {
|
||||
if (p == null) continue;
|
||||
view.add(Line.create()
|
||||
.append(Button.create(p.getLastKnownName())
|
||||
.setExecuteCommand("/dominion group add_member " + dominion.getName() + " " + group.getName() + " " + p.getLastKnownName() + " " + backPage)
|
||||
.setExecuteCommand("/dominion group add_member " + dominion.getName() + " " + group.getNamePlain() + " " + p.getLastKnownName() + " " + backPage)
|
||||
.build()));
|
||||
}
|
||||
view.showOn(player, page);
|
@ -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.dtos.*;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
@ -32,29 +33,29 @@ public class MemberList {
|
||||
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 3) {
|
||||
Notification.error(sender, "用法: /dominion member list <领地名称> [页码]");
|
||||
Notification.error(sender, Translation.TUI_MemberList_Usage);
|
||||
return;
|
||||
}
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
DominionDTO dominion = DominionDTO.select(args[2]);
|
||||
if (dominion == null) {
|
||||
Notification.error(sender, "领地 %s 不存在", args[2]);
|
||||
Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
|
||||
return;
|
||||
}
|
||||
int page = getPage(args, 3);
|
||||
ListView view = ListView.create(10, "/dominion member list " + dominion.getName());
|
||||
if (noAuthToManage(player, dominion)) return;
|
||||
List<MemberDTO> privileges = MemberDTO.select(dominion.getId());
|
||||
view.title("领地 " + dominion.getName() + " 成员列表");
|
||||
view.title(String.format(Translation.TUI_MemberList_Title.trans(), dominion.getName()));
|
||||
view.navigator(
|
||||
Line.create()
|
||||
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append("成员列表")
|
||||
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.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()));
|
||||
for (MemberDTO privilege : privileges) {
|
||||
PlayerDTO p_player = PlayerDTO.select(privilege.getPlayerUUID());
|
||||
@ -74,11 +75,11 @@ public class MemberList {
|
||||
}
|
||||
}
|
||||
|
||||
Button prev = Button.createGreen("权限")
|
||||
.setHoverText("配置成员权限")
|
||||
Button prev = Button.createGreen(Translation.TUI_MemberList_FlagButton)
|
||||
.setHoverText(Translation.TUI_MemberList_FlagDescription)
|
||||
.setExecuteCommand(CommandParser("/dominion member setting %s %s", dominion.getName(), p_player.getLastKnownName()));
|
||||
Button remove = Button.createRed("移除")
|
||||
.setHoverText("将此成员移出(变为访客)")
|
||||
Button remove = Button.createRed(Translation.TUI_MemberList_RemoveButton)
|
||||
.setHoverText(Translation.TUI_MemberList_RemoveDescription)
|
||||
.setExecuteCommand(CommandParser("/dominion member remove %s %s", dominion.getName(), p_player.getLastKnownName()));
|
||||
|
||||
if (!player.getUniqueId().equals(dominion.getOwner())) {
|
||||
@ -93,12 +94,12 @@ public class MemberList {
|
||||
}
|
||||
}
|
||||
if (disable) {
|
||||
prev.setDisabled("你不是领地主人,无法编辑管理员权限");
|
||||
remove.setDisabled("你不是领地主人,无法移除管理员");
|
||||
prev.setDisabled(Translation.TUI_MemberList_NoPermissionSet);
|
||||
remove.setDisabled(Translation.TUI_MemberList_NoPermissionRemove);
|
||||
}
|
||||
}
|
||||
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(prev.build());
|
||||
@ -109,11 +110,11 @@ public class MemberList {
|
||||
}
|
||||
|
||||
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)))
|
||||
.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)))
|
||||
.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)))
|
||||
.hoverEvent(Component.text("这个成员在一个权限组里"));
|
||||
.hoverEvent(Component.text(Translation.TUI_MemberList_GroupTag.trans()));
|
||||
}
|
@ -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.Flag;
|
||||
import cn.lunadeer.dominion.dtos.MemberDTO;
|
||||
import cn.lunadeer.dominion.dtos.PlayerDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
@ -27,14 +28,14 @@ public class MemberSetting {
|
||||
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 3) {
|
||||
Notification.error(sender, "用法: /dominion member setting <领地名称> <玩家名称> [页码]");
|
||||
Notification.error(sender, Translation.TUI_MemberSetting_Usage);
|
||||
return;
|
||||
}
|
||||
Player player = playerOnly(sender);
|
||||
if (player == null) return;
|
||||
DominionDTO dominion = DominionDTO.select(args[2]);
|
||||
if (dominion == null) {
|
||||
Notification.error(sender, "领地 %s 不存在", args[2]);
|
||||
Notification.error(sender, Translation.Messages_DominionNotExist, args[2]);
|
||||
return;
|
||||
}
|
||||
if (noAuthToManage(player, dominion)) return;
|
||||
@ -43,39 +44,45 @@ public class MemberSetting {
|
||||
ListView view = ListView.create(10, "/dominion member setting " + dominion.getName() + " " + playerName);
|
||||
PlayerDTO playerDTO = PlayerDTO.select(playerName);
|
||||
if (playerDTO == null) {
|
||||
Notification.error(sender, "玩家 %s 不存在", playerName);
|
||||
Notification.error(sender, Translation.Messages_PlayerNotExist, playerName);
|
||||
return;
|
||||
}
|
||||
MemberDTO privilege = MemberDTO.select(playerDTO.getUuid(), dominion.getId());
|
||||
if (privilege == null) {
|
||||
Notification.warn(sender, "玩家 %s 不是领地 %s 的成员", playerName, dominion.getName());
|
||||
Notification.warn(sender, Translation.Messages_PlayerNotMember, playerName, dominion.getName());
|
||||
return;
|
||||
}
|
||||
view.title("玩家 " + playerName + " 在领地 " + dominion.getName() + " 的权限设置");
|
||||
view.title(String.format(Translation.TUI_MemberSetting_Title.trans(), playerName, dominion.getName()));
|
||||
view.navigator(
|
||||
Line.create()
|
||||
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create("我的领地").setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create("管理界面").setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append(Button.create("成员列表").setExecuteCommand("/dominion member list " + dominion.getName()).build())
|
||||
.append("成员权限")
|
||||
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_DominionList).setExecuteCommand("/dominion list").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_Manage).setExecuteCommand("/dominion manage " + dominion.getName()).build())
|
||||
.append(Button.create(Translation.TUI_Navigation_MemberList).setExecuteCommand("/dominion member list " + dominion.getName()).build())
|
||||
.append(Translation.TUI_Navigation_MemberSetting)
|
||||
);
|
||||
view.add(Line.create().append(Button.createGreen("套用模板")
|
||||
.setHoverText("选择一个权限模板套用")
|
||||
view.add(Line.create().append(Button.createGreen(Translation.TUI_MemberSetting_ApplyTemplateButton)
|
||||
.setHoverText(Translation.TUI_MemberSetting_ApplyTemplateDescription)
|
||||
.setExecuteCommand("/dominion member select_template " + dominion.getName() + " " + playerName).build()));
|
||||
if (privilege.getAdmin()) {
|
||||
view.add(Line.create()
|
||||
.append(Button.createGreen("☑").setExecuteCommand(
|
||||
parseCommand(dominion.getName(), playerName, "admin", false, page)
|
||||
).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));
|
||||
} else {
|
||||
view.add(Line.create()
|
||||
.append(Button.createRed("☐").setExecuteCommand(
|
||||
parseCommand(dominion.getName(), playerName, "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()) {
|
||||
view.add(createOption(flag, privilege.getFlagValue(flag), playerName, dominion.getName(), page));
|
||||
}
|
@ -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.dtos.PlayerDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
@ -22,7 +23,7 @@ public class SelectPlayer {
|
||||
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 3) {
|
||||
Notification.error(sender, "用法: /dominion member select_player <领地名称> [页码]");
|
||||
Notification.error(sender, Translation.TUI_SelectPlayer_Usage);
|
||||
return;
|
||||
}
|
||||
Player player = playerOnly(sender);
|
||||
@ -31,10 +32,10 @@ public class SelectPlayer {
|
||||
String dominion_name = args[2];
|
||||
ListView view = ListView.create(10, "/dominion member select_player " + dominion_name);
|
||||
Line sub = Line.create()
|
||||
.append("只能选择已经登录过的玩家")
|
||||
.append(Button.create("搜索").setExecuteCommand("/dominion cui_member_add " + dominion_name).build())
|
||||
.append(Button.create("返回").setExecuteCommand("/dominion member list " + dominion_name).build());
|
||||
view.title("选择玩家添加为成员").subtitle(sub);
|
||||
.append(Translation.TUI_SelectPlayer_Description)
|
||||
.append(Button.create(Translation.TUI_SearchButton).setExecuteCommand("/dominion cui_member_add " + dominion_name).build())
|
||||
.append(Button.create(Translation.TUI_BackButton).setExecuteCommand("/dominion member list " + dominion_name).build());
|
||||
view.title(Translation.TUI_SelectPlayer_Title).subtitle(sub);
|
||||
List<PlayerDTO> players = PlayerController.allPlayers();
|
||||
for (PlayerDTO p : players) {
|
||||
if (p.getUuid() == player.getUniqueId()) {
|
@ -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.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
@ -20,7 +21,7 @@ public class SelectTemplate {
|
||||
public static void show(CommandSender sender, String[] args) {
|
||||
if (args.length < 4) {
|
||||
// /dominion member select_template <领地名称> <玩家名称> [页码]
|
||||
Notification.error(sender, "用法: /dominion member select_template <领地名称> <玩家名称> [页码]");
|
||||
Notification.error(sender, Translation.TUI_SelectTemplate_Usage);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -36,16 +37,16 @@ public class SelectTemplate {
|
||||
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
|
||||
|
||||
ListView view = ListView.create(10, "/dominion member select_template " + dominionName + " " + playerName);
|
||||
view.title("选择一个模板");
|
||||
view.title(Translation.TUI_SelectTemplate_Title);
|
||||
Line sub = Line.create()
|
||||
.append("套用在领地 " + dominionName + " 的成员 " + playerName + " 身上")
|
||||
.append(Button.create("返回").setExecuteCommand("/dominion member setting " + dominionName + " " + playerName).build());
|
||||
.append(String.format(Translation.TUI_SelectTemplate_Description.trans(), dominionName, playerName))
|
||||
.append(Button.create(Translation.TUI_BackButton).setExecuteCommand("/dominion member setting " + dominionName + " " + playerName).build());
|
||||
view.subtitle(sub);
|
||||
|
||||
for (PrivilegeTemplateDTO template : templates) {
|
||||
// /dominion member apply_template <领地名称> <成员名称> <模板名称>
|
||||
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()))
|
||||
.build())
|
||||
.append(Component.text(template.getName())));
|
@ -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.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Line;
|
||||
@ -29,17 +30,17 @@ public class TemplateList {
|
||||
ListView view = ListView.create(10, "/dominion template list");
|
||||
|
||||
List<PrivilegeTemplateDTO> templates = PrivilegeTemplateDTO.selectAll(player.getUniqueId());
|
||||
view.title("成员权限模板列表");
|
||||
view.navigator(Line.create().append(Button.create("主菜单").setExecuteCommand("/dominion menu").build()).append("模板列表"));
|
||||
view.title(Translation.TUI_TemplateList_Title);
|
||||
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")
|
||||
.setHoverText("创建一个新的成员权限模板");
|
||||
Button create = Button.create(Translation.TUI_TemplateList_CreateButton).setExecuteCommand("/dominion cui_template_create")
|
||||
.setHoverText(Translation.TUI_TemplateList_CreateDescription);
|
||||
|
||||
view.add(Line.create().append(create.build()));
|
||||
|
||||
for (PrivilegeTemplateDTO template : templates) {
|
||||
Button manage = Button.createGreen("配置").setExecuteCommand("/dominion template setting " + template.getName());
|
||||
Button delete = Button.createRed("删除").setExecuteCommand("/dominion template delete " + template.getName());
|
||||
Button manage = Button.createGreen(Translation.TUI_EditButton).setExecuteCommand("/dominion template setting " + template.getName());
|
||||
Button delete = Button.createRed(Translation.TUI_DeleteButton).setExecuteCommand("/dominion template delete " + template.getName());
|
||||
Line line = Line.create()
|
||||
.append(delete.build())
|
||||
.append(manage.build())
|
@ -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.PrivilegeTemplateDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.ListView;
|
||||
import cn.lunadeer.minecraftpluginutils.stui.components.Button;
|
||||
@ -30,16 +31,16 @@ public class TemplateSetting {
|
||||
int page = getPage(args, 3);
|
||||
PrivilegeTemplateDTO template = PrivilegeTemplateDTO.select(player.getUniqueId(), args[2]);
|
||||
if (template == null) {
|
||||
Notification.error(sender, "模板 %s 不存在", args[2]);
|
||||
Notification.error(sender, Translation.Messages_TemplateNotExist, args[2]);
|
||||
return;
|
||||
}
|
||||
|
||||
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()
|
||||
.append(Button.create("主菜单").setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create("模板列表").setExecuteCommand("/dominion template list").build())
|
||||
.append("模板管理")
|
||||
.append(Button.create(Translation.TUI_Navigation_Menu).setExecuteCommand("/dominion menu").build())
|
||||
.append(Button.create(Translation.TUI_Navigation_TemplateList).setExecuteCommand("/dominion template list").build())
|
||||
.append(Translation.TUI_Navigation_TemplateSetting)
|
||||
);
|
||||
|
||||
// /dominion template_set_flag <模板名称> <权限名称> <true/false> [页码]
|
||||
@ -47,11 +48,17 @@ public class TemplateSetting {
|
||||
if (template.getAdmin()) {
|
||||
view.add(Line.create()
|
||||
.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 {
|
||||
view.add(Line.create()
|
||||
.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()) {
|
||||
view.add(createOption(flag, template.getFlagValue(flag), template.getName(), page));
|
@ -7,12 +7,6 @@ import cn.lunadeer.dominion.dtos.Flag;
|
||||
import cn.lunadeer.dominion.dtos.GroupDTO;
|
||||
import cn.lunadeer.dominion.dtos.MemberDTO;
|
||||
import cn.lunadeer.dominion.managers.Translation;
|
||||
import cn.lunadeer.minecraftpluginutils.Notification;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.TextComponent;
|
||||
import net.kyori.adventure.text.format.Style;
|
||||
import net.kyori.adventure.text.format.TextColor;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
@ -77,11 +71,9 @@ public class EventUtils {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
TextComponent msg = Component.text(
|
||||
String.format(Translation.Messages_NoPermissionForFlag.trans(), flag.getDisplayName(), flag.getDescription()),
|
||||
Style.style(TextColor.color(0xFF0000), TextDecoration.BOLD))
|
||||
.hoverEvent(Component.text(flag.getDescription()));
|
||||
Notification.actionBar(player, msg);
|
||||
String msg = String.format(Translation.Messages_NoPermissionForFlag.trans(), flag.getDisplayName(), flag.getDescription());
|
||||
msg = "&#FF0000" + "&l" + msg;
|
||||
MessageDisplay.show(player, Dominion.config.getMessageDisplayNoPermission(), msg);
|
||||
if (event != null) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -6,7 +6,6 @@ import cn.lunadeer.dominion.dtos.MemberDTO;
|
||||
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 org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -57,7 +56,7 @@ public class TuiUtils {
|
||||
|
||||
public static boolean notOp(CommandSender sender) {
|
||||
if (!sender.isOp()) {
|
||||
Notification.error(sender, "你没有权限访问此页面");
|
||||
Notification.error(sender, Translation.Messages_PageNoPermission);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1,7 +1,8 @@
|
||||
package cn.lunadeer.dominion.utils.map;
|
||||
|
||||
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.XLogger;
|
||||
@ -21,7 +22,7 @@ public class BlueMapConnect {
|
||||
try {
|
||||
BlueMapAPI.getInstance().ifPresent(api -> {
|
||||
Map<String, List<DominionDTO>> world_dominions = new HashMap<>();
|
||||
for (DominionDTO dominion : Cache.instance.getDominions()) {
|
||||
for (DominionDTO dominion : Cache.instance.getAllDominions()) {
|
||||
if (dominion.getWorld() == null) {
|
||||
continue;
|
||||
}
|
||||
@ -37,6 +38,11 @@ public class BlueMapConnect {
|
||||
.build();
|
||||
|
||||
for (DominionDTO dominion : d.getValue()) {
|
||||
PlayerDTO p = PlayerDTO.select(dominion.getOwner());
|
||||
if (p == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Collection<Vector2d> vectors = new ArrayList<>();
|
||||
vectors.add(new Vector2d(dominion.getX1() + 0.001, dominion.getZ1() + 0.001));
|
||||
vectors.add(new Vector2d(dominion.getX2() - 0.001, dominion.getZ1() + 0.001));
|
||||
@ -55,6 +61,7 @@ public class BlueMapConnect {
|
||||
Color fill = new Color(r, g, b, 0.2F);
|
||||
ExtrudeMarker marker = ExtrudeMarker.builder()
|
||||
.label(dominion.getName())
|
||||
.detail(String.format(Translation.Messages_MapInfoDetail.trans(), dominion.getName(), p.getLastKnownName()))
|
||||
.position(x, y, z)
|
||||
.shape(shape, dominion.getY1() + 0.001f, dominion.getY2() - 0.001f)
|
||||
.lineColor(line)
|
||||
|
@ -1,6 +1,7 @@
|
||||
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.XLogger;
|
||||
@ -40,7 +41,11 @@ public class DynmapConnect extends DynmapCommonAPIListener {
|
||||
}
|
||||
|
||||
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[] zz = {dominion.getZ1(), dominion.getZ2()};
|
||||
if (dominion.getWorld() == null) {
|
||||
|
@ -14,7 +14,7 @@ public class MapRender {
|
||||
}
|
||||
|
||||
if (Dominion.config.getDynmap()) {
|
||||
DynmapConnect.instance.setDominionMarkers(Cache.instance.getDominions());
|
||||
DynmapConnect.instance.setDominionMarkers(Cache.instance.getAllDominions());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -9,19 +9,42 @@ Database:
|
||||
Language: zh-cn
|
||||
|
||||
AutoCreateRadius: 10
|
||||
DefaultJoinMessage: '&3{OWNER}: Welcome to {DOM}!'
|
||||
DefaultLeaveMessage: '&3{OWNER}: Leaving {DOM}...'
|
||||
|
||||
MessageDisplay:
|
||||
NoPermission: ACTION_BAR
|
||||
JoinLeave: ACTION_BAR
|
||||
|
||||
Limit:
|
||||
SpawnProtection: 10
|
||||
MinY: -64
|
||||
MaxY: 320
|
||||
SizeX: 128
|
||||
SizeY: 64
|
||||
SizeZ: 128
|
||||
Size:
|
||||
MaxX: 128
|
||||
MaxY: 64
|
||||
MaxZ: 128
|
||||
MinX: 4
|
||||
MinY: 4
|
||||
MinZ: 4
|
||||
Amount: 10
|
||||
Depth: 3
|
||||
Vert: false
|
||||
WorldBlackList: [ ]
|
||||
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:
|
||||
Enable: true
|
||||
@ -32,6 +55,8 @@ AutoCleanAfterDays: 180
|
||||
|
||||
Tool: ARROW
|
||||
|
||||
InfoTool: STRING
|
||||
|
||||
Economy:
|
||||
Enable: false
|
||||
Price: 10.0
|
||||
|
@ -1,20 +1,29 @@
|
||||
# >---------------------------------<
|
||||
# | 圈地限制特殊权限组配置 |
|
||||
# >---------------------------------<
|
||||
# 此文件可以作为模板,你可以将此文件复制后重命名为你想要的权限组名,然后修改里面的配置
|
||||
# 如果你想给赞助玩家(或者VIP)一些特殊优惠,例如更少的圈地价格、更大的领地等,你可以在这里配置
|
||||
# 详细说明参阅 > https://ssl.lunadeer.cn:14448/doc/82/
|
||||
|
||||
|
||||
MinY: -64 # 最小Y坐标
|
||||
MaxY: 320 # 最大Y坐标
|
||||
SizeX: 128 # X方向最大长度 -1:表示不限制
|
||||
SizeY: 64 # Y方向最大长度 -1:表示不限制
|
||||
SizeZ: 128 # Z方向最大长度 -1:表示不限制
|
||||
Amount: 10 # 最大领地数量 -1:表示不限制
|
||||
Depth: 3 # 子领地深度 0:不允许子领地 -1:不限制
|
||||
Vert: false # 是否自动延伸到 MaxY 和 MinY
|
||||
WorldBlackList: [ ] # 不允许领地的世界
|
||||
Price: 10.0 # 方块单价
|
||||
OnlyXZ: false # 是否只计算xz平面积
|
||||
Refund: 0.85 # 删除领地退还比例
|
||||
MinY: -64
|
||||
MaxY: 320
|
||||
Size:
|
||||
MaxX: 128
|
||||
MaxY: 64
|
||||
MaxZ: 128
|
||||
MinX: 4
|
||||
MinY: 4
|
||||
MinZ: 4
|
||||
Amount: 10
|
||||
Depth: 3
|
||||
Vert: false
|
||||
Price: 10.0
|
||||
OnlyXZ: false
|
||||
Refund: 0.85
|
||||
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
|
||||
|
@ -3,10 +3,12 @@ version: @version@
|
||||
main: cn.lunadeer.dominion.Dominion
|
||||
api-version: '1.20'
|
||||
folia-supported: true
|
||||
libraries: [ ]
|
||||
softdepend:
|
||||
- Vault
|
||||
- dynmap
|
||||
- PlaceholderAPI
|
||||
- BlueMap
|
||||
commands:
|
||||
Dominion:
|
||||
description: 领地插件命令
|
||||
|
5
docs/LANGS.md
Normal file
5
docs/LANGS.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Languages
|
||||
|
||||
* [中文(简体)](zh-cn/)
|
||||
* [中文(繁體)](zh-hk/)
|
||||
* [English](en-us/)
|
21
docs/book.json
Normal file
21
docs/book.json
Normal 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
39
docs/en-us/README.md
Normal 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
24
docs/en-us/SUMMARY.md
Normal 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)
|
1
docs/en-us/command-list.md
Normal file
1
docs/en-us/command-list.md
Normal file
@ -0,0 +1 @@
|
||||
# 指令列表
|
23
docs/en-us/create-dominion.md
Normal file
23
docs/en-us/create-dominion.md
Normal file
@ -0,0 +1,23 @@
|
||||
# 创建领地
|
||||
|
||||
## 名称规则
|
||||
|
||||
- 领地名称不可与其他领地重复;
|
||||
- 领地名称不可包含空格;
|
||||
- 领地名称不可包含特殊字符;
|
||||
|
||||
## 手动创建
|
||||
|
||||
需要使用圈地工具(默认为箭矢),依次使用左键点选领地长方体区域的第一个点、右键点击长方体区域的第二个点。然后使用:
|
||||
`/dominion create <领地名称>`创建领地,领地名称不可与其他领地重复。
|
||||
|
||||
## 自动创建
|
||||
|
||||
不需要选择对角线点,会以玩家为中心自动创建一定区域的领地。
|
||||
|
||||
1. 使用 `/dominion` 打开主菜单,点击`【创建领地】`;
|
||||
2. 在弹出的 UI 中输入你要创建的领地名称;
|
||||
3. 输入完成后左键点击下方中间的绿色混凝土,即可自动创建一块领地;
|
||||
|
||||
> 自动创建半径是由服务器管理员在配置文件中设置的;
|
||||
|
99
docs/en-us/developer.md
Normal file
99
docs/en-us/developer.md
Normal 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/)。
|
14
docs/en-us/manage-dominion/README.md
Normal file
14
docs/en-us/manage-dominion/README.md
Normal file
@ -0,0 +1,14 @@
|
||||
# 领地管理
|
||||
|
||||
领地的管理可以通过领地菜单完成,通常来说您不需要任何指令就可以完成领地的管理。
|
||||
|
||||
## 主菜单界面 `/dominion`
|
||||
|
||||
使用 `/dominion` 可以打开领地系统的可视化操作菜单界面(TUI)。单击`【我的领地】`可以查看自己创建的所有领地。
|
||||
|
||||
## 领地管理界面 `/dominion manage [领地名称]`
|
||||
|
||||
单击对应领地的【管理】即可进入对应领地的管理界面,通过管理界面可以管理此领地的权限等信息。 也可以直接输入
|
||||
`/dominion manage [领地名称]` 来快速打开当前所在领地的管理界面。
|
||||
|
||||
> 领地名称是可选的,不填写则自动打开你当前所在的领地管理界面。
|
16
docs/en-us/manage-dominion/environment.md
Normal file
16
docs/en-us/manage-dominion/environment.md
Normal file
@ -0,0 +1,16 @@
|
||||
# 环境设置
|
||||
|
||||
## 简介
|
||||
|
||||
领地环境设置主要包含了领地内的一些非玩家行为的设置,例如TNT爆炸、火焰蔓延等等。
|
||||
|
||||
## 设置方法
|
||||
|
||||
1. 打开领地菜单 `/dominion`;
|
||||
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`;
|
||||
3. 在领地管理界面中选择 `【环境设置】`;
|
||||
4. 点击对应设置项的权限前的 ☑/☐ 来允许或者禁止对应的领地环境行为。
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 鼠标移动到权限名称上可以显示此权限的详细(描述)信息;
|
26
docs/en-us/manage-dominion/group-title.md
Normal file
26
docs/en-us/manage-dominion/group-title.md
Normal 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 之类的。
|
||||
|
17
docs/en-us/manage-dominion/message.md
Normal file
17
docs/en-us/manage-dominion/message.md
Normal file
@ -0,0 +1,17 @@
|
||||
# 领地提示消息
|
||||
|
||||
## 进入消息
|
||||
|
||||
可以为领地设置玩家进入时的欢迎语句,提示语将在玩家进入领地时弹出。
|
||||
|
||||
```
|
||||
/dominion set_enter_msg <提示语> [领地名称]
|
||||
```
|
||||
|
||||
## 离开消息
|
||||
|
||||
可以为领地设置玩家离开时的欢送语句,提示语将在玩家离开领地时弹出。
|
||||
|
||||
```
|
||||
/dominion set_leave_msg <提示语> [领地名称]
|
||||
```
|
53
docs/en-us/manage-dominion/permission/README.md
Normal file
53
docs/en-us/manage-dominion/permission/README.md
Normal file
@ -0,0 +1,53 @@
|
||||
# 权限管理
|
||||
|
||||
## 简介
|
||||
|
||||
Dominion 采用了 `访客-成员-权限组` 的权限管理模型。通过此方案既可以满足对于权限的细粒度控制,又可以保证权限的可维护性,减轻玩家的操作负担。
|
||||
|
||||
- [访客](guest):领地的访客权限,不属于领地成员的玩家将收到此权限的限制;
|
||||
- [成员](member.md):领地的成员权限,属于领地成员的玩家将收到此权限的限制;
|
||||
- [权限组](permission-group.md):领地的权限组,将玩家添加到权限组中,可以为多个玩家配置相同的权限;
|
||||
|
||||
## 权限模型透视
|
||||
|
||||
```
|
||||
┌───────────┐
|
||||
│ Player │
|
||||
└─────┬─────┘
|
||||
▼
|
||||
┌───────────┐ ┌───────────┐
|
||||
│ IsMember? │───►│ HasGroup? │
|
||||
└─────┬─────┘ Y └──┬────┬───┘
|
||||
│N │ │
|
||||
▼ │ │
|
||||
┌───────────┐ N│ Y│
|
||||
│ Visitor │ │ │
|
||||
└───────────┘ │ │
|
||||
┌───────────┐ │ │
|
||||
│ Member │◄──────┘ │
|
||||
└───────────┘ │
|
||||
┌───────────┐ │
|
||||
│ Group │◄───────────┘
|
||||
└───────────┘
|
||||
```
|
||||
|
||||
- 当一个玩家不属于领地成员时将收到访客权限的限制;
|
||||
- 如果是领地成员那么会判断玩家是否属于权限组;
|
||||
- 如果玩家属于权限组那么将收到对应权限组的行为控制;
|
||||
- 如果玩家不属于权限组那么将采用该玩家在此领地中的成员权限;
|
||||
|
||||
## 领地管理员
|
||||
|
||||
管理员是领地成员权限中的一个特殊权限:
|
||||
|
||||
- ✅管理员可以做的事:
|
||||
- 该领地的其他所有权限
|
||||
- 修改领地权限
|
||||
- 修改领地的玩家权限(添加、删除、修改)
|
||||
- ❌管理员不可以做的事:
|
||||
- 删除领地
|
||||
- 修改领地尺寸
|
||||
- 将其他玩家设置为管理员
|
||||
|
||||
通过将一些玩家设置为管理员,可以让他们帮助你管理领地的其他玩家,减轻领地所有人的操作负担。同时不必担心管理员会对领地进行破坏性操作(例如删除、缩小领地)。
|
||||
|
19
docs/en-us/manage-dominion/permission/guest.md
Normal file
19
docs/en-us/manage-dominion/permission/guest.md
Normal file
@ -0,0 +1,19 @@
|
||||
# 访客权限
|
||||
|
||||
## 简介
|
||||
|
||||
访客是相对于领地成员而言的,通过设置访客权限,你可以控制非领地成员的玩家在领地内的行为。
|
||||
|
||||
例如:如果你是个大好人希望提供公共物资给服务器内的其他玩家使用,那么你可以将该领地访客权限中的【容器】权限打开。
|
||||
这样其他玩家就可以在你的领地内使用你的箱子了,无需给他们领地成员的权限。
|
||||
|
||||
## 设置方法
|
||||
|
||||
1. 打开领地菜单 `/dominion`;
|
||||
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`;
|
||||
3. 在领地管理界面中选择 `【访客权限】`;
|
||||
4. 点击对应设置项的权限前的 ☑/☐ 来允许或者禁止对应的领地环境行为。
|
||||
|
||||
## 封禁一个玩家?
|
||||
|
||||
Dominion自身并没有直接提供封禁玩家的功能,但是你可以通过将玩家添加为领地成员,然后关闭他的【移动】权限来实现类似的效果。具体操作请参考[领地成员](member.md)。
|
32
docs/en-us/manage-dominion/permission/member.md
Normal file
32
docs/en-us/manage-dominion/permission/member.md
Normal file
@ -0,0 +1,32 @@
|
||||
# 领地成员
|
||||
|
||||
## 简介
|
||||
|
||||
顾名思义。
|
||||
|
||||
## 添加成员
|
||||
|
||||
1. 打开领地菜单 `/dominion`;
|
||||
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`;
|
||||
3. 在领地管理界面中选择 `【成员管理】`;
|
||||
4. 点击 `【添加成员】`,选择或输入玩家名称添加为领地成员。
|
||||
|
||||
## 管理成员
|
||||
|
||||
1. 打开领地菜单 `/dominion`;
|
||||
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`;
|
||||
3. 在领地管理界面中选择 `【成员管理】`,此处列出了领地的所有成员;
|
||||
- 点击 `【配置权限】` 可以配置此成员在领地内的权限;
|
||||
- 点击 `【移除成员】` 可以将此成员移出领地;
|
||||
- 如果一个玩家属于某[权限组](permission-group.md),那么你不能单独编辑他的权限,对应`【配置权限】`为灰色不可点击;
|
||||
|
||||
玩家名称最前方标记含义:
|
||||
- 【A】:该领地管理员
|
||||
- 【N】:普通成员
|
||||
- 【B】:黑名单成员(没有移动权限)
|
||||
- 【G】:属于某个权限组
|
||||
|
||||
## 注意事项
|
||||
|
||||
- 选择成员页面只会显示在安装了Dominion后登录过服务器的玩家名称,因此暂时不支持对从没有在服务器登录过的玩家进行操作。
|
||||
- 通过搜索框添加成员不支持模糊搜索,需要输入准确的玩家名称(大小写敏感)。
|
51
docs/en-us/manage-dominion/permission/permission-group.md
Normal file
51
docs/en-us/manage-dominion/permission/permission-group.md
Normal file
@ -0,0 +1,51 @@
|
||||
# 权限组
|
||||
|
||||
## 简介
|
||||
|
||||
权限组可以对一批玩家的权限进行统一的管理、设置,减少大量重复的操作,提高效率。
|
||||
|
||||
## 创建权限组
|
||||
|
||||
1. 打开领地菜单 `/dominion`;
|
||||
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`;
|
||||
3. 在领地管理界面中选择 `【权限组】`;
|
||||
4. 点击 `【创建权限组】`,输入权限组名称,左键点击绿色混凝土完成创建;
|
||||
|
||||
## 权限组成员管理
|
||||
|
||||
权限组成员只能是领地成员,因此需要**先将玩家添加为领地成员**,才能将其编入权限组。
|
||||
|
||||
- 添加成员:点击权限组后面的`【+】`,选择领地成员;
|
||||
- 移除成员:点击玩家名字前面的`【-】`;
|
||||
|
||||
## 管理权限组
|
||||
|
||||
- 编辑权限组:点击权限组前的`【编辑】`,配置此权限组的权限或修改权限组的名称;
|
||||
- 删除权限组:点击权限组前的`【删除】`,删除此权限组;
|
||||
- 配置权限:在编辑页面,点击对应权限前的 ☑/☐ 来允许或者禁止该权限组内的玩家的行为;
|
||||
|
||||
> 注意:删除权限组后,权限组内的成员会被自动移出权限组,成为领地普通成员。
|
||||
|
||||
## 其他
|
||||
|
||||
- 权限组名称同时也可以作为称号,用来对外展示玩家在领地的角色/地位/身份,详见[权限组称号](../group-title.md);
|
||||
- 权限组名称支持 RGB 彩色效果,详情参见 [彩色字符](https://ssl.lunadeer.cn:14448/doc/81/);
|
||||
|
||||
## Q&A 常见问题
|
||||
|
||||
Q:我将玩家 A 编入了权限组 G,还可以手动设置 A 的成员权限吗?
|
||||
|
||||
A:不可以,编入权限组 G 后此玩家的行为只能由此权限组控制。
|
||||
|
||||
---
|
||||
|
||||
Q:我将玩家 A 编入了权限组 G1,还能再编入权限组 G2 吗?
|
||||
|
||||
A:不可以,在一个领地内一个玩家只能属于一个权限组,不支持混合。
|
||||
|
||||
---
|
||||
|
||||
Q:我将玩家 A 编入了权限组 G,然后一不小心删除了权限组 G 会发生生么?
|
||||
|
||||
A:玩家会被自动移出权限组,成为领地一般成员。
|
||||
|
37
docs/en-us/manage-dominion/permission/template.md
Normal file
37
docs/en-us/manage-dominion/permission/template.md
Normal file
@ -0,0 +1,37 @@
|
||||
# 权限模板
|
||||
|
||||
权限模板功能允许你预先配置好一组权限,然后直接将模板套用到成员身上,即可快速将此成员的权限设置为理想的状态。相比于权限组,模板主要适用于某些特殊的、非通用的权限组和。
|
||||
例如:你并不喜欢权限组的统一性,你希望每个成员都有自己的权限设置,但是又不想每次都手动设置,这时候权限模板就派上用场了。
|
||||
|
||||
## 创建一个模板
|
||||
|
||||
1. 打开领地菜单 `/dominion`;
|
||||
2. 在主菜单点击`【权限模板】`;
|
||||
3. 点击`【创建成员权限模板】`,输入模板名称,点击绿色混凝土完成创建;
|
||||
4. 点击模板前的`【管理】`,配置此模板的权限;
|
||||
|
||||
## 使用模板
|
||||
|
||||
1. 打开领地菜单 `/dominion`;
|
||||
2. 在 `【我的领地】` 中点击对应领地的 `【管理】`;
|
||||
3. 在领地管理界面中选择 `【成员管理】`,此处列出了领地的所有成员;
|
||||
4. 点击 `【配置权限】` 后,点击 `【套用模板】`;
|
||||
5. 在列表中点击你想要使用的模板,完成权限模板的套用;
|
||||
|
||||
## Q&A 常见问题
|
||||
|
||||
Q:我将模板 T 套用在了玩家 A 身上,还可以手动设置 A 的成员权限吗?
|
||||
|
||||
A:可以。
|
||||
|
||||
---
|
||||
|
||||
Q:我将模板 T 套用在了玩家 A 身上,修改玩家 A 的权限会同步修改模板 T 的权限吗?
|
||||
|
||||
A:不会,模板应用是单向的。
|
||||
|
||||
---
|
||||
|
||||
Q:我将模板 T 套用在了玩家 A 身上,修改模板 T 的权限会同步修改玩家 A 的权限吗?
|
||||
|
||||
A:不会,模板应用是一次性的,类似于批量处理,不会产生连锁影响。
|
23
docs/en-us/manage-dominion/resize.md
Normal file
23
docs/en-us/manage-dominion/resize.md
Normal file
@ -0,0 +1,23 @@
|
||||
# 修改领地尺寸
|
||||
|
||||
## 扩大
|
||||
|
||||
面向想要扩大的方向,使用命令:
|
||||
|
||||
```
|
||||
/dominion expand [大小] [领地名称]
|
||||
```
|
||||
|
||||
- 大小:可选,默认为10;
|
||||
- 领地名称:可选,默认为当前所在领地,如果在子领地内则需要指定领地名称;
|
||||
|
||||
## 缩小
|
||||
|
||||
面向想要缩小的方向,使用命令:
|
||||
|
||||
```
|
||||
/dominion contract [大小] [领地名称]
|
||||
```
|
||||
|
||||
- 大小:可选,默认为10;
|
||||
- 领地名称:可选,默认为当前所在领地,如果在子领地内则需要指定领地名称;
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user