From 2badd67dbce828bd2ed20ab8abfb412bfe98c216 Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Mon, 25 Dec 2023 23:47:38 +1100 Subject: [PATCH 01/33] Create maven-publish.yml --- .github/workflows/maven-publish.yml | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/maven-publish.yml diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml new file mode 100644 index 0000000..dab69fe --- /dev/null +++ b/.github/workflows/maven-publish.yml @@ -0,0 +1,34 @@ +# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created +# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path + +name: Maven Package + +on: + release: + types: [created] + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file + + - name: Build with Maven + run: mvn -B package --file pom.xml + + - name: Publish to GitHub Packages Apache Maven + run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml + env: + GITHUB_TOKEN: ${{ github.token }} From c7abea4b32feeea84e7ef459355897fa7857e789 Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Mon, 25 Dec 2023 23:55:57 +1100 Subject: [PATCH 02/33] Delete .github/workflows/maven-publish.yml --- .github/workflows/maven-publish.yml | 34 ----------------------------- 1 file changed, 34 deletions(-) delete mode 100644 .github/workflows/maven-publish.yml diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml deleted file mode 100644 index dab69fe..0000000 --- a/.github/workflows/maven-publish.yml +++ /dev/null @@ -1,34 +0,0 @@ -# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created -# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path - -name: Maven Package - -on: - release: - types: [created] - -jobs: - build: - - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 11 - uses: actions/setup-java@v3 - with: - java-version: '11' - distribution: 'temurin' - server-id: github # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Build with Maven - run: mvn -B package --file pom.xml - - - name: Publish to GitHub Packages Apache Maven - run: mvn deploy -s $GITHUB_WORKSPACE/settings.xml - env: - GITHUB_TOKEN: ${{ github.token }} From cb6c9a1803f8cbda9507439b46f53032ba0a7f30 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 09:49:04 +0800 Subject: [PATCH 03/33] Create bug_report.yml --- ISSUE_TEMPLATE/bug_report.yml | 55 +++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 ISSUE_TEMPLATE/bug_report.yml diff --git a/ISSUE_TEMPLATE/bug_report.yml b/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..98d78d4 --- /dev/null +++ b/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,55 @@ +name: 🐛 BUG 反馈 +description: 请在这里反馈BUG +labels: bug 插件功能问题 +body: + - type: markdown + attributes: + value: | + 非常感谢你来反馈该插件的BUG!但是在此之前请先确认你遇到的问题确实是一个BUG,按照[自主排错](https://ultikits.com/troubleshoot.html)的步骤也许能够解决你遇到的问题 + 仅接受6.0.0或更高版本的问题反馈,旧版本请先升级后尝试复现问题,仍存在问题再打开 Issue + 旧版本 (5.2.1) 请前往 [旧仓库](https://github.com/wisdommen/UltiTools) 反馈问题 (即将不受支持) + - type: textarea + id: the-problem + attributes: + label: 你遇到的问题 + description: + 详细描述一下你遇到的问题以及如何复现 + validations: + required: true + - type: dropdown + id: version + attributes: + label: 插件版本 + description: 你现在正在使用的插件版本 + options: + - 6.0.1 + - 6.0.0 + - 5.x 版本请到旧仓库提交 Issue + - 这边建议先更新一下插件版本再看看有没有问题 + validations: + required: true + - type: input + id: dep-version + attributes: + label: 各个依赖版本(可选,建议填写) + description: + '例如:PAPI:xxx Vault:xxx' + - type: textarea + id: logs + attributes: + label: 服务器日志(如无报错可不填) + description: + 在这里贴上**完整的**异常日志,可以使用 pastebin.com 来上传 + placeholder: + 可以不用完整的日志,但一定要有重要的内容,如果你不确定哪些是有用的,你可以选择上传完整的内容 + - type: textarea + id: screenshots + attributes: + label: 截图 + description: 如果需要,可以附上截图 + - type: textarea + id: additional-context + attributes: + label: 额外信息 + description: + 有什么想说的吗? From acc3f6ff391539561de961f48af8d997657bb321 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 09:51:13 +0800 Subject: [PATCH 04/33] Create config.yml --- ISSUE_TEMPLATE/config.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 ISSUE_TEMPLATE/config.yml diff --git a/ISSUE_TEMPLATE/config.yml b/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..6c1f402 --- /dev/null +++ b/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,14 @@ +blank_issues_enabled: false +contact_links: + - name: UltiTools 5 仓库 + url: https://github.com/wisdommen/UltiTools + about: 旧版本仓库,即将归档 + - name: 自主排错 Troubleshoot + url: https://doc.ultitools.ultikits.com/guide/troubleshoot.html + about: 根据我们提供的自主排错步骤,也许能够解决一些您的问题 + - name: 官方文档 Wiki + url: https://doc.ultitools.ultikits.com + about: 学会主动看文档是很重要的 + - name: 在官方 QQ 群寻求帮助 Ask For Help + url: https://jq.qq.com/?_wv=1027&k=s7FBdzGh + about: 在寻求帮助之前还请一定一定要把文档阅读清楚了 From 600cc44a0ef0b6574d75c3c09a7f4d27585c2f50 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 09:53:00 +0800 Subject: [PATCH 05/33] Create feature_request.yml --- ISSUE_TEMPLATE/feature_request.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 ISSUE_TEMPLATE/feature_request.yml diff --git a/ISSUE_TEMPLATE/feature_request.yml b/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..5d7efbf --- /dev/null +++ b/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,26 @@ +name: ⭐ 意见与建议 +description: 对这款插件有什么想法,还是有什么新功能的要求,请在这里提出 +body: + - type: markdown + attributes: + value: | + 非常感谢你能够来为这个插件提出意见,你可以申请开发新功能,或者对现有功能提出优化和改进等等等等! + - type: textarea + id: the-feature-request + attributes: + label: 请求内容 + description: + 在这里提出你对插件的意见与建议,可以是要求新功能,也可以是对现有功能的改进 + validations: + required: true + - type: textarea + id: proposed-solution + attributes: + label: 解决方案 + description: 如果你有任何对以上内容的解决方案,可以写在这里,如果能提交相应的 Pull Request 那就更好了 + - type: textarea + id: additional-context + attributes: + label: 附加信息 + description: + 还有什么想说的吗 From 75ab435f5243d22c8206096b81d7337dda575d6e Mon Sep 17 00:00:00 2001 From: qianmo <67282958@qq.com> Date: Tue, 26 Dec 2023 09:58:05 +0800 Subject: [PATCH 06/33] update issue template --- {ISSUE_TEMPLATE => .github/ISSUE_TEMPLATE}/bug_report.yml | 0 {ISSUE_TEMPLATE => .github/ISSUE_TEMPLATE}/config.yml | 0 {ISSUE_TEMPLATE => .github/ISSUE_TEMPLATE}/feature_request.yml | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {ISSUE_TEMPLATE => .github/ISSUE_TEMPLATE}/bug_report.yml (100%) rename {ISSUE_TEMPLATE => .github/ISSUE_TEMPLATE}/config.yml (100%) rename {ISSUE_TEMPLATE => .github/ISSUE_TEMPLATE}/feature_request.yml (100%) diff --git a/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml similarity index 100% rename from ISSUE_TEMPLATE/bug_report.yml rename to .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from ISSUE_TEMPLATE/config.yml rename to .github/ISSUE_TEMPLATE/config.yml diff --git a/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml similarity index 100% rename from ISSUE_TEMPLATE/feature_request.yml rename to .github/ISSUE_TEMPLATE/feature_request.yml From d243cc934c10524065fac4bb482351e49f433b01 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 10:55:34 +0800 Subject: [PATCH 07/33] Create maven-ci.yml Create maven-ci.yml --- .github/workflows/maven-ci.yml | 57 ++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 .github/workflows/maven-ci.yml diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml new file mode 100644 index 0000000..b2a4fb6 --- /dev/null +++ b/.github/workflows/maven-ci.yml @@ -0,0 +1,57 @@ +name: Java CI with Maven + +on: + push: + branches: [ "main" ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B package --file UltiTools/pom.xml + - name: Get latest commit message + id: commit + run: echo "::set-output name=message::$(git log --format=%B -n 1 ${{ github.sha }})" + - name: Install xmlstarlet + run: sudo apt-get update && sudo apt-get install -y xmlstarlet + - name: Get version + id: version + run: echo "::set-output name=version::$(xmlstarlet sel -t -v '/project/version' UltiTools-API/pom.xml)" + # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive + - name: Update dependency graph + uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 + + release: + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ steps.version.outputs.version }} + release_name: Release v${{ steps.version.outputs.version }} + body: ${{ steps.commit.outputs.message }} + draft: true + prerelease: true + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar + asset_name: UltiTools-API.jar + asset_content_type: application/java-archive From cd45eea5627b00c7fb88f86502d4f5678c8ff208 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 10:56:48 +0800 Subject: [PATCH 08/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index b2a4fb6..405d0d4 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -16,7 +16,7 @@ jobs: distribution: 'temurin' cache: maven - name: Build with Maven - run: mvn -B package --file UltiTools/pom.xml + run: mvn -B package --file UltiTools-API/pom.xml - name: Get latest commit message id: commit run: echo "::set-output name=message::$(git log --format=%B -n 1 ${{ github.sha }})" From 409094ddd6ff98934b18c43a4eb88cdbe7140fb1 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 11:00:09 +0800 Subject: [PATCH 09/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 405d0d4..e4c7cb2 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -25,9 +25,6 @@ jobs: - name: Get version id: version run: echo "::set-output name=version::$(xmlstarlet sel -t -v '/project/version' UltiTools-API/pom.xml)" - # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - - name: Update dependency graph - uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 release: needs: build From 925091441df89fd58add1da20fe343aaeb73af25 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 11:43:41 +0800 Subject: [PATCH 10/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index e4c7cb2..8c12a8e 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -5,7 +5,7 @@ on: branches: [ "main" ] jobs: - build: + build-and-release: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -25,12 +25,6 @@ jobs: - name: Get version id: version run: echo "::set-output name=version::$(xmlstarlet sel -t -v '/project/version' UltiTools-API/pom.xml)" - - release: - needs: build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - name: Create Release id: create_release uses: actions/create-release@v1 @@ -52,3 +46,4 @@ jobs: asset_path: UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar asset_name: UltiTools-API.jar asset_content_type: application/java-archive + From 8b997f20424ff88ea9b25acb341b2b3ab87f409b Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 12:03:36 +0800 Subject: [PATCH 11/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 8c12a8e..3e34e39 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -20,11 +20,9 @@ jobs: - name: Get latest commit message id: commit run: echo "::set-output name=message::$(git log --format=%B -n 1 ${{ github.sha }})" - - name: Install xmlstarlet - run: sudo apt-get update && sudo apt-get install -y xmlstarlet - - name: Get version + - name: Get Project Version from pom.xml id: version - run: echo "::set-output name=version::$(xmlstarlet sel -t -v '/project/version' UltiTools-API/pom.xml)" + uses: entimaniac/read-pom-version-action@1.0.0 - name: Create Release id: create_release uses: actions/create-release@v1 From dd9fca47527acd3b53aee5d31e52aa136016c340 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 12:10:53 +0800 Subject: [PATCH 12/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 3e34e39..14a102f 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -16,13 +16,16 @@ jobs: distribution: 'temurin' cache: maven - name: Build with Maven - run: mvn -B package --file UltiTools-API/pom.xml + run: mvn -B package -Dmaven.javadoc.skip=true --file UltiTools-API/pom.xml - name: Get latest commit message id: commit run: echo "::set-output name=message::$(git log --format=%B -n 1 ${{ github.sha }})" - name: Get Project Version from pom.xml id: version - uses: entimaniac/read-pom-version-action@1.0.0 + - uses: avides/actions-project-version-check@v1.4.0 + - with: + token: ${{ secrets.GITHUB_TOKEN }} + file-to-check: UltiTools-API/pom.xml - name: Create Release id: create_release uses: actions/create-release@v1 From 13761d20c80fbd44ee7394846b66f65707a79f62 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 12:12:17 +0800 Subject: [PATCH 13/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 14a102f..77a4a99 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -22,8 +22,8 @@ jobs: run: echo "::set-output name=message::$(git log --format=%B -n 1 ${{ github.sha }})" - name: Get Project Version from pom.xml id: version - - uses: avides/actions-project-version-check@v1.4.0 - - with: + uses: avides/actions-project-version-check@v1.4.0 + with: token: ${{ secrets.GITHUB_TOKEN }} file-to-check: UltiTools-API/pom.xml - name: Create Release From 5754437d710d388298eec31ce4e1ccfb3bf2c9fd Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 12:17:42 +0800 Subject: [PATCH 14/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 77a4a99..d71676f 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -26,6 +26,7 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} file-to-check: UltiTools-API/pom.xml + only-return-version: true - name: Create Release id: create_release uses: actions/create-release@v1 From 3ddcc9befc32900ba774830e8429b636716823e0 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 12:48:10 +0800 Subject: [PATCH 15/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 39 +++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index d71676f..e738dad 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -5,21 +5,47 @@ on: branches: [ "main" ] jobs: - build-and-release: + build: runs-on: ubuntu-latest + steps: - uses: actions/checkout@v3 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: java-version: '17' distribution: 'temurin' cache: maven + - name: Build with Maven run: mvn -B package -Dmaven.javadoc.skip=true --file UltiTools-API/pom.xml + + - name: Get Project Version from pom.xml + id: version + uses: avides/actions-project-version-check@v1.4.0 + with: + token: ${{ secrets.GITHUB_TOKEN }} + file-to-check: UltiTools-API/pom.xml + only-return-version: true + + - name: Archive artifacts + uses: actions/upload-artifact@v4.0.0 + with: + name: ultitools-artifact + path: UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar + + release: + needs: build + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Get latest commit message id: commit run: echo "::set-output name=message::$(git log --format=%B -n 1 ${{ github.sha }})" + - name: Get Project Version from pom.xml id: version uses: avides/actions-project-version-check@v1.4.0 @@ -27,6 +53,12 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} file-to-check: UltiTools-API/pom.xml only-return-version: true + + - name: Download artifacts + uses: actions/download-artifact@v2 + with: + name: ultitools-artifact + - name: Create Release id: create_release uses: actions/create-release@v1 @@ -38,6 +70,7 @@ jobs: body: ${{ steps.commit.outputs.message }} draft: true prerelease: true + - name: Upload Release Asset id: upload-release-asset uses: actions/upload-release-asset@v1 @@ -45,7 +78,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar + asset_path: UltiTools-API-${{ steps.version.outputs.version }}.jar asset_name: UltiTools-API.jar asset_content_type: application/java-archive - + From c299bbf4c4c6fea7208c3b2f2837fc699441e56f Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 12:51:40 +0800 Subject: [PATCH 16/33] Update maven-ci.yml Update maven-ci.yml --- .github/workflows/maven-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index e738dad..4053a55 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -55,7 +55,7 @@ jobs: only-return-version: true - name: Download artifacts - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v4.1.0 with: name: ultitools-artifact From 0af6161d2347a0d9f81d01f174164ec6626eee13 Mon Sep 17 00:00:00 2001 From: Qian Mo <62180110+qianmo2233@users.noreply.github.com> Date: Tue, 26 Dec 2023 12:58:29 +0800 Subject: [PATCH 17/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 4053a55..06fd1d0 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -3,6 +3,8 @@ name: Java CI with Maven on: push: branches: [ "main" ] + paths: + - 'UltiTools-API/**' jobs: build: @@ -81,4 +83,3 @@ jobs: asset_path: UltiTools-API-${{ steps.version.outputs.version }}.jar asset_name: UltiTools-API.jar asset_content_type: application/java-archive - From 75a21a0b358db77d845254292a8ba433431aff16 Mon Sep 17 00:00:00 2001 From: qianmo <67282958@qq.com> Date: Tue, 26 Dec 2023 13:21:28 +0800 Subject: [PATCH 18/33] update workflow --- .github/workflows/maven-ci.yml | 18 ++++++++++++++++++ UltiTools-API/pom.xml | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 06fd1d0..aae2e90 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -83,3 +83,21 @@ jobs: asset_path: UltiTools-API-${{ steps.version.outputs.version }}.jar asset_name: UltiTools-API.jar asset_content_type: application/java-archive + + publish: + needs: release + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + + - name: Publish package + run: mvn --batch-mode --file UltiTools-API/pom.xml deploy + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/UltiTools-API/pom.xml b/UltiTools-API/pom.xml index 7eb5e25..1fb6e10 100755 --- a/UltiTools-API/pom.xml +++ b/UltiTools-API/pom.xml @@ -48,6 +48,10 @@ ultikits-sonatype https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + github + https://maven.pkg.github.com/UltiKits/UltiTools-Reborn + From 3800f21955d0af4047e39478811dd0962a0d7348 Mon Sep 17 00:00:00 2001 From: qianmo <67282958@qq.com> Date: Tue, 26 Dec 2023 13:30:09 +0800 Subject: [PATCH 19/33] update workflow --- .github/workflows/maven-ci.yml | 20 +------------------- UltiTools-API/pom.xml | 4 ---- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index aae2e90..4f45856 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -82,22 +82,4 @@ jobs: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: UltiTools-API-${{ steps.version.outputs.version }}.jar asset_name: UltiTools-API.jar - asset_content_type: application/java-archive - - publish: - needs: release - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - cache: maven - - - name: Publish package - run: mvn --batch-mode --file UltiTools-API/pom.xml deploy - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file + asset_content_type: application/java-archive \ No newline at end of file diff --git a/UltiTools-API/pom.xml b/UltiTools-API/pom.xml index 1fb6e10..7eb5e25 100755 --- a/UltiTools-API/pom.xml +++ b/UltiTools-API/pom.xml @@ -48,10 +48,6 @@ ultikits-sonatype https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ - - github - https://maven.pkg.github.com/UltiKits/UltiTools-Reborn - From 0018707bfe226a6a7d620716db93950d7a8607d4 Mon Sep 17 00:00:00 2001 From: qianmo <67282958@qq.com> Date: Tue, 26 Dec 2023 13:37:40 +0800 Subject: [PATCH 20/33] update workflow --- .github/workflows/maven-ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 4f45856..40aa1a2 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -1,4 +1,4 @@ -name: Java CI with Maven +name: UltiTools API CI with Maven on: push: @@ -70,8 +70,8 @@ jobs: tag_name: v${{ steps.version.outputs.version }} release_name: Release v${{ steps.version.outputs.version }} body: ${{ steps.commit.outputs.message }} - draft: true - prerelease: true + draft: false + prerelease: false - name: Upload Release Asset id: upload-release-asset From 10adac6fa0bcaa827c68defbb260cc73e5790959 Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 18:26:10 +1100 Subject: [PATCH 21/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 40aa1a2..67c1e41 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -61,15 +61,35 @@ jobs: with: name: ultitools-artifact + - name: Get Latest Merged PR + id: get-pr + uses: actions/github-script@v5 + with: + script: | + const { data: pullRequest } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'closed', + sort: 'updated', + direction: 'desc', + per_page: 1 + }); + const mergedPR = pullRequest.find(pr => pr.merged_at); + return { + id: mergedPR.number, + title: mergedPR.title, + body: mergedPR.body + }; + result-encoding: json + - name: Create Release - id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: - tag_name: v${{ steps.version.outputs.version }} - release_name: Release v${{ steps.version.outputs.version }} - body: ${{ steps.commit.outputs.message }} + tag_name: v${{ steps.get-pr.outputs.id }} + release_name: Release ${{ steps.get-pr.outputs.title }} + body: ${{ steps.get-pr.outputs.body }} draft: false prerelease: false @@ -82,4 +102,4 @@ jobs: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: UltiTools-API-${{ steps.version.outputs.version }}.jar asset_name: UltiTools-API.jar - asset_content_type: application/java-archive \ No newline at end of file + asset_content_type: application/java-archive From 9b71b7785b832cb8a210e04050b06276daac698a Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 18:40:34 +1100 Subject: [PATCH 22/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 67c1e41..e999247 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -66,7 +66,8 @@ jobs: uses: actions/github-script@v5 with: script: | - const { data: pullRequest } = await github.rest.pulls.list({ + // 获取最新合并的 PR + const { data: pullRequests } = await github.rest.pulls.list({ owner: context.repo.owner, repo: context.repo.repo, state: 'closed', @@ -74,11 +75,21 @@ jobs: direction: 'desc', per_page: 1 }); - const mergedPR = pullRequest.find(pr => pr.merged_at); + const mergedPR = pullRequests.find(pr => pr.merged_at); + + // 获取该 PR 的第一条评论 + const comments = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: mergedPR.number, + per_page: 1 + }); + + // 设置输出 return { id: mergedPR.number, title: mergedPR.title, - body: mergedPR.body + first_comment: comments.data.length > 0 ? comments.data[0].body : 'No comments found' }; result-encoding: json From 7946dddd65cf6d72059bdae8205c049e2f3cb33c Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 18:45:11 +1100 Subject: [PATCH 23/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index e999247..881a09f 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -94,6 +94,7 @@ jobs: result-encoding: json - name: Create Release + id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 2d65f54213d253325f7bc2cbeec524b75b4cfb9b Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:02:04 +1100 Subject: [PATCH 24/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 881a09f..1043636 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -27,7 +27,7 @@ jobs: id: version uses: avides/actions-project-version-check@v1.4.0 with: - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.RELEASE_TOKEN }} file-to-check: UltiTools-API/pom.xml only-return-version: true @@ -52,7 +52,7 @@ jobs: id: version uses: avides/actions-project-version-check@v1.4.0 with: - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.RELEASE_TOKEN }} file-to-check: UltiTools-API/pom.xml only-return-version: true @@ -97,7 +97,7 @@ jobs: id: create_release uses: actions/create-release@v1 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} with: tag_name: v${{ steps.get-pr.outputs.id }} release_name: Release ${{ steps.get-pr.outputs.title }} @@ -109,7 +109,7 @@ jobs: id: upload-release-asset uses: actions/upload-release-asset@v1 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: UltiTools-API-${{ steps.version.outputs.version }}.jar From c472ca57cab06df0a4c9d1e596eedbbcee89489e Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:11:36 +1100 Subject: [PATCH 25/33] Revert "Release 6.0.5" --- BasicFunctions/pom.xml | 24 +- .../com/ultikits/plugins/BasicFunctions.java | 104 ++- .../plugins/commands/BackCommands.java | 19 +- .../plugins/commands/BanCommands.java | 8 +- .../plugins/commands/FlyCommands.java | 23 +- .../plugins/commands/GMChangeCommand.java | 88 ++- .../plugins/commands/HealCommand.java | 32 +- .../plugins/commands/HideCommands.java | 69 -- .../plugins/commands/LoreCommands.java | 152 ---- .../plugins/commands/RandomTpCommands.java | 24 +- .../plugins/commands/SetSpawnCommands.java | 38 - .../plugins/commands/SpawnCommands.java | 37 - .../plugins/commands/SpeedCommands.java | 44 +- .../plugins/commands/TpaCommands.java | 130 ++-- .../plugins/commands/TpaHereCommands.java | 122 +-- .../plugins/commands/WarpCommands.java | 96 --- .../plugins/commands/WhitelistCommands.java | 118 +-- .../ultikits/plugins/config/BasicConfig.java | 12 - .../plugins/config/DeathPunishmentConfig.java | 41 - .../plugins/config/PlayerNameTagConfig.java | 25 - .../ultikits/plugins/config/WarpConfig.java | 23 - .../com/ultikits/plugins/data/WarpData.java | 23 - .../ultikits/plugins/data/WhiteListData.java | 2 - .../com/ultikits/plugins/guis/WarpGui.java | 52 -- .../plugins/listeners/BackListener.java | 2 - .../plugins/listeners/BanListener.java | 6 +- .../plugins/listeners/DeathListener.java | 45 -- .../plugins/listeners/HideListener.java | 15 - .../listeners/JoinWelcomeListener.java | 2 - .../listeners/PlayerNameTagListener.java | 32 - .../plugins/listeners/WhitelistListener.java | 6 +- .../plugins/services/DeathPunishService.java | 55 -- .../plugins/services/WarpService.java | 117 --- .../plugins/services/WhiteListService.java | 2 - .../plugins/tasks/DeathPunishmentTask.java | 87 --- .../plugins/tasks/NamePrefixSuffixTask.java | 30 - .../ultikits/plugins/utils/TitlesUtils.java | 49 -- .../src/main/resources/config/config.yml | 12 - .../src/main/resources/config/death.yml | 38 - .../src/main/resources/config/title.yml | 8 - .../src/main/resources/config/warp.yml | 6 - .../src/main/resources/lang/en.json | 35 +- BasicFunctions/src/main/resources/plugin.yml | 2 +- Economy/pom.xml | 4 +- Home/pom.xml | 8 +- .../com/ultikits/plugins/home/PluginMain.java | 10 +- .../plugins/home/commands/HomeCommands.java | 9 +- .../plugins/home/gui/HomeListGui.java | 8 +- Home/src/main/resources/plugin.yml | 2 +- MysqlConnector/pom.xml | 2 +- Sidebar/pom.xml | 8 +- .../plugins/sidebar/PlayerJoinListener.java | 16 +- .../ultikits/plugins/sidebar/SbCommand.java | 37 - .../plugins/sidebar/SidebarConfig.java | 8 +- .../plugins/sidebar/SidebarPlugin.java | 28 +- .../ultikits/plugins/sidebar/UpdateTask.java | 14 +- Sidebar/src/main/resources/plugin.yml | 4 +- UltiTools-API/pom.xml | 62 +- .../com/ultikits/ultitools/UltiTools.java | 55 +- .../abstracts/AbstractCommendExecutor.java | 269 ++++--- .../ultitools/abstracts/UltiToolsPlugin.java | 87 +-- .../abstracts/guis/OkCancelPage.java | 7 +- .../ultitools/abstracts/guis/PagingPage.java | 18 +- .../annotations/EnableAutoRegister.java | 6 +- .../ultitools/annotations/EventListener.java | 10 +- .../ultikits/ultitools/annotations/I18n.java | 8 +- .../annotations/UltiToolsModule.java | 36 - .../annotations/command/CmdExecutor.java | 8 - .../commands/PluginInstallCommands.java | 4 +- .../ultitools/commands/UltiToolsCommands.java | 5 +- .../entities/common/WorldLocation.java | 5 - .../ultitools/interfaces/IPlugin.java | 3 +- .../ultitools/interfaces/Localized.java | 6 +- .../interfaces/TempEventHandler.java | 8 - .../ultitools/interfaces/TempListener.java | 12 - .../interfaces/impl/PlayerTempListener.java | 55 -- .../impl/SimpleJsonDataOperator.java | 2 +- .../interfaces/impl/SimpleTempListener.java | 41 - .../listeners/PlayerJoinListener.java | 54 -- .../ultitools/manager/CommandManager.java | 112 +-- .../ultitools/manager/DataStoreManager.java | 2 +- .../ultitools/manager/ListenerManager.java | 14 - .../ultitools/manager/PluginManager.java | 59 +- .../ultikits/ultitools/utils/CommonUtils.java | 12 - .../com/ultikits/ultitools/utils/Metrics.java | 713 ------------------ UltiTools-API/src/main/resources/env.yml | 69 +- UltiTools-API/src/main/resources/lang/en.json | 2 +- UltiTools-API/src/main/resources/plugin.yml | 5 +- 88 files changed, 741 insertions(+), 3021 deletions(-) delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/HideCommands.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/LoreCommands.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/SetSpawnCommands.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpawnCommands.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/WarpCommands.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/config/DeathPunishmentConfig.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/config/PlayerNameTagConfig.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/config/WarpConfig.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/data/WarpData.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/guis/WarpGui.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/listeners/DeathListener.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/listeners/HideListener.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/listeners/PlayerNameTagListener.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/services/DeathPunishService.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/services/WarpService.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/tasks/DeathPunishmentTask.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/tasks/NamePrefixSuffixTask.java delete mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/utils/TitlesUtils.java delete mode 100644 BasicFunctions/src/main/resources/config/death.yml delete mode 100644 BasicFunctions/src/main/resources/config/title.yml delete mode 100644 BasicFunctions/src/main/resources/config/warp.yml delete mode 100644 Sidebar/src/main/java/com/ultikits/plugins/sidebar/SbCommand.java delete mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/UltiToolsModule.java delete mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempEventHandler.java delete mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempListener.java delete mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/PlayerTempListener.java delete mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleTempListener.java delete mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/listeners/PlayerJoinListener.java delete mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/utils/Metrics.java diff --git a/BasicFunctions/pom.xml b/BasicFunctions/pom.xml index ae5173e..4643b70 100644 --- a/BasicFunctions/pom.xml +++ b/BasicFunctions/pom.xml @@ -6,7 +6,7 @@ com.ultikits.plugins BasicFunctions - 1.0.4 + 1.0.0 8 @@ -18,7 +18,7 @@ com.ultikits UltiTools-API - 6.0.5 + 6.0.3 provided @@ -45,25 +45,9 @@ 1.18.24 provided - - com.nametagedit - nametagedit - 4.4.16 - provided - - - com.github.BlueMap-Minecraft - BlueMapAPI - v2.6.2 - provided - - - upstream - https://ci.nametagedit.com/plugin/repository/everything/ - spigotmc-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -92,9 +76,9 @@ BasicFunctions UltiTools-Basic-Functions - 开服必装!所有的杂七杂八的小功能哦!包括不限于TPA,飞行,模式更改,白名单,随机传送。 + All basic functions of the UltiTools access_key.txt - F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins + F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/BasicFunctions.java b/BasicFunctions/src/main/java/com/ultikits/plugins/BasicFunctions.java index 210a0da..dc6303e 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/BasicFunctions.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/BasicFunctions.java @@ -3,22 +3,25 @@ package com.ultikits.plugins; import com.ultikits.plugins.commands.*; import com.ultikits.plugins.config.BasicConfig; import com.ultikits.plugins.config.JoinWelcomeConfig; -import com.ultikits.plugins.config.PlayerNameTagConfig; -import com.ultikits.plugins.config.WarpConfig; -import com.ultikits.plugins.listeners.*; -import com.ultikits.plugins.services.WarpService; -import com.ultikits.plugins.tasks.NamePrefixSuffixTask; -import com.ultikits.ultitools.UltiTools; +import com.ultikits.plugins.listeners.BackListener; +import com.ultikits.plugins.listeners.BanListener; +import com.ultikits.plugins.listeners.JoinWelcomeListener; +import com.ultikits.plugins.listeners.WhitelistListener; import com.ultikits.ultitools.abstracts.AbstractConfigEntity; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; -import com.ultikits.ultitools.annotations.UltiToolsModule; -import de.bluecolored.bluemap.api.BlueMapAPI; +//import com.ultikits.ultitools.annotations.ContextEntry; +//import com.ultikits.ultitools.annotations.EnableAutoRegister; import lombok.Getter; +import java.io.IOException; import java.util.Arrays; import java.util.List; -@UltiToolsModule +//@EnableAutoRegister( +// scanPackage = "com.ultikits.plugins", +// eventListener = false, +// cmdExecutor = false +//) public class BasicFunctions extends UltiToolsPlugin { @Getter private static BasicFunctions instance; @@ -29,85 +32,74 @@ public class BasicFunctions extends UltiToolsPlugin { } @Override - public boolean registerSelf() { + public boolean registerSelf() throws IOException { BasicConfig configEntity = getConfigManager().getConfigEntity(this, BasicConfig.class); if (configEntity.isEnableHeal()) { - getCommandManager().register(this, HideCommands.class); + getCommandManager().register(new HealCommand(), "ultikits.tools.command.heal", i18n("指令治愈功能"), "heal", "h"); } if (configEntity.isEnableGmChange()) { - getCommandManager().register(this, GMChangeCommand.class); + getCommandManager().register(new GMChangeCommand(), "ultikits.tools.command.gm", i18n("游戏模式切换功能"), "gm"); } if (configEntity.isEnableBack()) { - getCommandManager().register(this, BackCommands.class); - getListenerManager().register(this, BackListener.class); + getCommandManager().register(new BackCommands(), "ultikits.tools.command.back", i18n("快捷返回功能"), "back"); + getListenerManager().register(this, new BackListener()); } if (configEntity.isEnableRandomTeleport()) { - getCommandManager().register(this, RandomTpCommands.class); + getCommandManager().register(new RandomTpCommands(), "ultikits.tools.command.wild", i18n("随机传送功能"), "wild"); } if (configEntity.isEnableFly()) { - getCommandManager().register(this, FlyCommands.class); + getCommandManager().register(new FlyCommands(), "ultikits.tools.command.fly", i18n("飞行功能"), "fly"); } if (configEntity.isEnableWhitelist()) { - getCommandManager().register(this, WhitelistCommands.class); - getListenerManager().register(this, WhitelistListener.class); + getCommandManager().register(new WhitelistCommands(), "ultikits.tools.whitelist", i18n("白名单功能"), "wl"); + getListenerManager().register(this, new WhitelistListener()); } if (configEntity.isEnableJoinWelcome()) { - getListenerManager().register(this, JoinWelcomeListener.class); + getListenerManager().register(this, new JoinWelcomeListener()); } if (configEntity.isEnableTpa()) { - getCommandManager().register(this, TpaCommands.class); - getCommandManager().register(this, TpaHereCommands.class); + getCommandManager().register(new TpaCommands(), "ultikits.tools.command.tpa", i18n("传送请求功能"), "tpa"); + getCommandManager().register(new TpaHereCommands(), "ultikits.tools.command.tphere", i18n("请求传送到此功能"), "tphere"); } if (configEntity.isEnableSpeed()) { - getCommandManager().register(this, SpeedCommands.class); + getCommandManager().register(new SpeedCommands(), "ultikits.tools.command.speed", i18n("速度设置功能"), "speed"); } if (configEntity.isEnableBan()) { - getCommandManager().register(this, BanCommands.class); - getListenerManager().register(this, BanListener.class); - } - if (configEntity.isEnableWarp()) { - getCommandManager().register(this, WarpCommands.class); - WarpConfig warpConfig = getConfigManager().getConfigEntity(this, WarpConfig.class); - if (warpConfig.isEnableBlueMap()) { - BlueMapAPI.onEnable(api -> { - WarpService warpService = getContext().getBean(WarpService.class); - warpService.initBlueMap(); - }); - } - } - if (configEntity.isEnableSpawn()) { - getCommandManager().register(this, SpawnCommands.class); - getCommandManager().register(this, SetSpawnCommands.class); - } - if (configEntity.isEnableLoreEditor()) { - getCommandManager().register(this, LoreCommands.class); - } - if (configEntity.isEnableHide()) { - getCommandManager().register(this, HideCommands.class); - getListenerManager().register(this, HideListener.class); - } - if (configEntity.isEnableTitle()) { - getListenerManager().register(this, PlayerNameTagListener.class); - int updateInterval = getConfig(PlayerNameTagConfig.class).getUpdateInterval(); - new NamePrefixSuffixTask().runTaskTimer(UltiTools.getInstance(), 0, updateInterval); - } - if (configEntity.isEnableDeathPunishment()) { - getListenerManager().register(this, DeathListener.class); + getCommandManager().register(new BanCommands(), "ultikits.tools.command.uban", i18n("封禁功能"), "uban"); + getListenerManager().register(this, new BanListener()); } return true; } + @Override + public void unregisterSelf() { + getCommandManager().unregister("heal"); + getCommandManager().unregister("gm"); + getCommandManager().unregister("back"); + getCommandManager().unregister("wild"); + getCommandManager().unregister("fly"); + getCommandManager().unregister("wl"); + getCommandManager().unregister("tpa"); + getCommandManager().unregister("tphere"); + getCommandManager().unregister("speed"); + getListenerManager().unregisterAll(this); + } + + @Override + public void reloadSelf() { + getConfigManager().reloadConfigs(this); + } + @Override public List supported() { - return Arrays.asList("zh", "en"); + return super.supported(); } @Override public List getAllConfigs() { return Arrays.asList( new BasicConfig("config/config.yml"), - new JoinWelcomeConfig("config/join.yml"), - new PlayerNameTagConfig("config/title.yml") + new JoinWelcomeConfig("config/join.yml") ); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BackCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BackCommands.java index fc1af0d..44b1278 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BackCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BackCommands.java @@ -2,33 +2,28 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.listeners.BackListener; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; +import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor; import org.bukkit.Location; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import static com.ultikits.ultitools.utils.MessageUtils.warning; -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"back"}, manualRegister = true, permission = "ultikits.tools.command.back", description = "返回死亡地点") -public class BackCommands extends AbstractCommendExecutor { - - @CmdMapping(format = "") - public void back(@CmdSender Player player) { +public class BackCommands extends AbstractPlayerCommandExecutor { + @Override + protected boolean onPlayerCommand(Command command, String[] strings, Player player) { Location location = BackListener.getPlayerLastDeathLocation(player.getUniqueId()); if (location != null) { player.teleport(location); } else { player.sendMessage(warning(BasicFunctions.getInstance().i18n("无法找到死亡地点!这可能是因为插件重载或者你还没死过哩。"))); } + return true; } @Override - protected void handleHelp(CommandSender sender) { + protected void sendHelpMessage(CommandSender sender) { sender.sendMessage(BasicFunctions.getInstance().i18n("/back 返回死亡地点")); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BanCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BanCommands.java index 0b9df72..6276cbc 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BanCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BanCommands.java @@ -11,10 +11,11 @@ import org.springframework.beans.factory.annotation.Autowired; @CmdTarget(CmdTarget.CmdTargetType.BOTH) -@CmdExecutor(permission = "ultikits.ban.command.all", description = "封禁功能", alias = {"uban"}, manualRegister = true) +@CmdExecutor(permission = "ultikits.ban.command.all", description = "Ban功能", alias = {"uban"}) public class BanCommands extends AbstractCommendExecutor { + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") @Autowired - private BanPlayerService banPlayerService; + private BanPlayerService banPlayerService = new BanPlayerService(); @CmdMapping(format = "ban ") public void banPlayer(@CmdSender CommandSender sender, @CmdParam("player") String player, @CmdParam("reason") String reason) { @@ -35,7 +36,6 @@ public class BanCommands extends AbstractCommendExecutor { @Override protected void handleHelp(CommandSender sender) { - sender.sendMessage(BasicFunctions.getInstance().i18n("§c/uban ban §7封禁玩家")); - sender.sendMessage(BasicFunctions.getInstance().i18n("§c/uban unban §7解封玩家")); + } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/FlyCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/FlyCommands.java index 585b152..69cb4c4 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/FlyCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/FlyCommands.java @@ -1,30 +1,31 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; +import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import static com.ultikits.ultitools.utils.MessageUtils.info; +import static com.ultikits.ultitools.utils.MessageUtils.warning; -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"fly"}, manualRegister = true, permission = "ultikits.tools.command.fly", description = "飞行功能") -public class FlyCommands extends AbstractCommendExecutor { +public class FlyCommands extends AbstractPlayerCommandExecutor { - @CmdMapping(format = "") - public void fly(@CmdSender Player player) { + @Override + protected boolean onPlayerCommand(Command command, String[] strings, Player player) { + if (!player.hasPermission("ultikits.tools.command.fly")) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; + } player.setAllowFlight(!player.getAllowFlight()); player.sendMessage(info(player.getAllowFlight() ? BasicFunctions.getInstance().i18n("已打开飞行") : BasicFunctions.getInstance().i18n("已关闭飞行"))); + return true; } @Override - protected void handleHelp(CommandSender sender) { + protected void sendHelpMessage(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("用法:/fly"))); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/GMChangeCommand.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/GMChangeCommand.java index 825a878..bfea042 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/GMChangeCommand.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/GMChangeCommand.java @@ -1,46 +1,78 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; +import com.ultikits.ultitools.abstracts.AbstractTabExecutor; import org.bukkit.ChatColor; import org.bukkit.GameMode; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"gm"}, manualRegister = true, permission = "ultikits.tools.command.gm", description = "游戏模式切换功能") -public class GMChangeCommand extends AbstractCommendExecutor { +import java.util.Arrays; +import java.util.List; - @CmdMapping(format = "0", permission = "ultikits.tools.command.gm.0") - public void changeGameMode0(@CmdSender Player player, String mode) { - player.setGameMode(GameMode.SURVIVAL); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("生存模式"))); - } - - @CmdMapping(format = "1", permission = "ultikits.tools.command.gm.1") - public void changeGameMode1(@CmdSender Player player, String mode) { - player.setGameMode(GameMode.CREATIVE); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("创造模式"))); - } +import static com.ultikits.ultitools.utils.MessageUtils.warning; - @CmdMapping(format = "2", permission = "ultikits.tools.command.gm.2") - public void changeGameMode2(@CmdSender Player player, String mode) { - player.setGameMode(GameMode.ADVENTURE); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("冒险模式"))); +public class GMChangeCommand extends AbstractTabExecutor { + @Override + protected boolean onPlayerCommand(Command command, String[] strings, Player player) { + if (player.hasPermission("ultikits.tools.command.gm.all") + || player.hasPermission("ultikits.tools.command.gm.0") + || player.hasPermission("ultikits.tools.command.gm.1") + || player.hasPermission("ultikits.tools.command.gm.2") + || player.hasPermission("ultikits.tools.command.gm.3")) { + switch (strings[0]) { + case "0": + if (player.hasPermission("ultikits.tools.command.gm.all") + || player.hasPermission("ultikits.tools.command.gm.0")) { + player.setGameMode(GameMode.SURVIVAL); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("生存模式"))); + return true; + } + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; + case "1": + if (player.hasPermission("ultikits.tools.command.gm.all") + || player.hasPermission("ultikits.tools.command.gm.1")) { + player.setGameMode(GameMode.CREATIVE); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("创造模式"))); + return true; + } + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; + case "2": + if (player.hasPermission("ultikits.tools.command.gm.all") + || player.hasPermission("ultikits.tools.command.gm.2")) { + player.setGameMode(GameMode.ADVENTURE); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("冒险模式"))); + return true; + } + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; + case "3": + if (player.hasPermission("ultikits.tools.command.gm.all") + || player.hasPermission("ultikits.tools.command.gm.3")) { + player.setGameMode(GameMode.SPECTATOR); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("旁观模式"))); + return true; + } + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; + default: + return false; + } + } + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; } - @CmdMapping(format = "3", permission = "ultikits.tools.command.gm.3") - public void changeGameMode3(@CmdSender Player player, String mode) { - player.setGameMode(GameMode.SPECTATOR); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("旁观模式"))); + @Override + protected List onPlayerTabComplete(Command command, String[] strings, Player player) { + return Arrays.asList("0", "1", "2", "3"); } @Override - protected void handleHelp(CommandSender sender) { + protected void sendHelpMessage(CommandSender sender) { sender.sendMessage(ChatColor.YELLOW + "/gm <0/1/2/3>"); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HealCommand.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HealCommand.java index b452957..bd99baa 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HealCommand.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HealCommand.java @@ -1,28 +1,30 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; +import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor; import org.bukkit.ChatColor; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"heal", "h"}, manualRegister = true, permission = "ultikits.tools.command.heal", description = "指令治愈功能") -public class HealCommand extends AbstractCommendExecutor { +import static com.ultikits.ultitools.utils.MessageUtils.warning; - @CmdMapping(format = "") - public void heal(@CmdSender Player player) { - player.setHealth(player.getMaxHealth()); - player.setFoodLevel(20); - player.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("你已被治愈!")); +public class HealCommand extends AbstractPlayerCommandExecutor { + + @Override + protected boolean onPlayerCommand(Command command, String[] strings, Player player) { + if (player.hasPermission("ultikits.tools.command.heal")) { + player.setHealth(player.getMaxHealth()); + player.setFoodLevel(20); + player.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("你已被治愈!")); + return true; + } + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; } @Override - protected void handleHelp(CommandSender sender) { - sender.sendMessage(BasicFunctions.getInstance().i18n("§c/heal §7治愈自己")); + protected void sendHelpMessage(CommandSender sender) { + } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HideCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HideCommands.java deleted file mode 100644 index 79cfeb1..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HideCommands.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ultikits.plugins.commands; - -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.UltiTools; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import static com.ultikits.ultitools.utils.MessageUtils.info; - -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"hide"}, manualRegister = true, permission = "ultikits.tools.command.hide", description = "隐身功能") -public class HideCommands extends AbstractCommendExecutor { - private static final List hidePlayers = new ArrayList<>(); - - public static void removeHidePlayer(UUID uuid) { - hidePlayers.remove(uuid); - } - - @CmdMapping(format = "") - public void hide(@CmdSender Player player) { - if (hidePlayers.contains(player.getUniqueId())) { - hidePlayers.remove(player.getUniqueId()); - new BukkitRunnable() { - @Override - public void run() { - for (Player p : Bukkit.getOnlinePlayers()) { - if (p.getUniqueId().equals(player.getUniqueId())) { - continue; - } - p.showPlayer(UltiTools.getInstance(), player); - } - } - }.runTaskAsynchronously(UltiTools.getInstance()); - player.sendMessage(info(BasicFunctions.getInstance().i18n("你已退出隐身"))); - } else { - hidePlayers.add(player.getUniqueId()); - new BukkitRunnable() { - @Override - public void run() { - for (Player p : Bukkit.getOnlinePlayers()) { - if (p.getUniqueId().equals(player.getUniqueId())) { - continue; - } - p.hidePlayer(UltiTools.getInstance(), player); - } - } - }.runTaskAsynchronously(UltiTools.getInstance()); - player.sendMessage(info(BasicFunctions.getInstance().i18n("你已进入隐身"))); - } - - } - - @Override - protected void handleHelp(CommandSender sender) { - sender.sendMessage(info(BasicFunctions.getInstance().i18n("/hide - 开启/关闭隐身"))); - } -} - diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/LoreCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/LoreCommands.java deleted file mode 100644 index 3f8aefe..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/LoreCommands.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.ultikits.plugins.commands; - -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.*; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; - -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"lore"}, manualRegister = true, permission = "ultikits.tools.command.lore", description = "物品Lore编辑功能") -public class LoreCommands extends AbstractCommendExecutor { - - @CmdMapping(format = "add ") - public void addLore(@CmdSender Player player, @CmdParam("lore...") String[] lore) { - ItemStack itemStack = player.getInventory().getItemInMainHand(); - if (itemStack.getType() == Material.AIR) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore")); - return; - } - ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta()); - List loreList = itemMeta.getLore(); - if (loreList == null) { - loreList = new ArrayList<>(); - } - String loreToAdd = String.join(" ", lore); - loreList.add(coloredMsg(loreToAdd)); - itemMeta.setLore(loreList); - itemStack.setItemMeta(itemMeta); - player.getInventory().setItemInMainHand(itemStack); - player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改")); - } - - @CmdMapping(format = "delete ") - public void deleteLore(@CmdSender Player player, @CmdParam("position") int position) { - ItemStack itemStack = player.getInventory().getItemInMainHand(); - if (itemStack.getType() == Material.AIR) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore")); - return; - } - ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta()); - List loreList = itemMeta.getLore(); - if (loreList == null || loreList.isEmpty()) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空")); - return; - } - if (position > loreList.size() || position < 1) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("Lore行数超出范围")); - return; - } - loreList.remove(position - 1); - itemMeta.setLore(loreList); - itemStack.setItemMeta(itemMeta); - player.getInventory().setItemInMainHand(itemStack); - player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改")); - } - - @CmdMapping(format = "edit ") - public void editLore(@CmdSender Player player, @CmdParam("position") int position, @CmdParam("lore...") String[] lore) { - ItemStack itemStack = player.getInventory().getItemInMainHand(); - if (itemStack.getType() == Material.AIR) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore")); - return; - } - ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta()); - List loreList = itemMeta.getLore(); - if (loreList == null || loreList.isEmpty()) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空")); - return; - } - if (position > loreList.size() || position < 1) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("Lore行数超出范围")); - return; - } - String loreToEdit = String.join(" ", lore); - if (position == 0) { - itemMeta.setDisplayName(coloredMsg(loreToEdit)); - } else { - loreList.set(position - 1, coloredMsg(loreToEdit)); - itemMeta.setLore(loreList); - } - itemStack.setItemMeta(itemMeta); - player.getInventory().setItemInMainHand(itemStack); - player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改")); - } - - @Override - protected List suggest(Player player, String[] strings) { - switch (strings.length) { - case 1: - return Arrays.asList( - "add", - "delete", - "edit" - ); - case 2: - case 3: - if (strings[0].equals("add")) { - return Collections.singletonList(BasicFunctions.getInstance().i18n("<内容>")); - } - ItemStack itemStack = player.getInventory().getItemInMainHand(); - if (itemStack.getType() == Material.AIR) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore")); - return Collections.emptyList(); - } - ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta()); - List lore = itemMeta.getLore(); - if (lore == null || lore.isEmpty()) { - player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空")); - return Collections.emptyList(); - } - List list = new ArrayList<>(); - for (int i = 1; i <= lore.size(); i++) { - list.add(i + ". " + lore.get(i - 1)); - } - - if ((strings[0].equals("edit") || strings[0].equals("delete")) && strings.length == 2) { - return list; - } else if (strings[0].equals("edit")) { - int position; - try { - position = Integer.parseInt(strings[1]); - } catch (NumberFormatException e) { - return Collections.singletonList(BasicFunctions.getInstance().i18n("<- 请输入对应的lore行数")); - } - if (position - 1 < lore.size() && position - 1 >= 0) { - return Collections.singletonList(lore.get(position - 1)); - } - } - break; - default: - return Collections.emptyList(); - } - return Collections.emptyList(); - } - - @Override - protected void handleHelp(CommandSender sender) { - sender.sendMessage(ChatColor.RED + "lore add <内容>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("添加Lore")); - sender.sendMessage(ChatColor.RED + "lore delete <行数>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("删除Lore")); - sender.sendMessage(ChatColor.RED + "lore edit <行数> <内容>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("编辑Lore")); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/RandomTpCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/RandomTpCommands.java index 75bcb03..fba7d92 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/RandomTpCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/RandomTpCommands.java @@ -2,16 +2,13 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.ultitools.UltiTools; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; +import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -21,12 +18,15 @@ import java.util.Random; import static com.ultikits.ultitools.utils.MessageUtils.info; import static com.ultikits.ultitools.utils.MessageUtils.warning; -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"wild"}, manualRegister = true, permission = "ultikits.tools.command.wild", description = "随机传送功能") -public class RandomTpCommands extends AbstractCommendExecutor { +public class RandomTpCommands extends AbstractPlayerCommandExecutor { - @CmdMapping(format = "") - public void wild(@CmdSender Player player) { + @Override + protected boolean onPlayerCommand(Command command, String[] strings, Player player) { + + if (!player.isOp() && !player.hasPermission("ultikits.tools.command.wild")) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return false; + } World.Environment environment = player.getWorld().getEnvironment(); if (environment == World.Environment.NETHER || environment == World.Environment.THE_END) { player.sendMessage(warning(BasicFunctions.getInstance().i18n("这个世界禁止使用随机传送!"))); @@ -58,10 +58,12 @@ public class RandomTpCommands extends AbstractCommendExecutor { } }.runTask(UltiTools.getInstance()); } + + return true; } @Override - protected void handleHelp(CommandSender sender) { + protected void sendHelpMessage(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("随机传送到一个安全的地方"))); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SetSpawnCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SetSpawnCommands.java deleted file mode 100644 index 185b3c9..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SetSpawnCommands.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.ultikits.plugins.commands; - -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import static com.ultikits.ultitools.utils.MessageUtils.error; -import static com.ultikits.ultitools.utils.MessageUtils.info; - -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"setspawn"}, manualRegister = true, permission = "ultikits.tools.command.setspawn", description = "重生点功能") -public class SetSpawnCommands extends AbstractCommendExecutor { - - @CmdMapping(format = "") - public void setSpawn(@CmdSender Player player) { - Location location = player.getLocation(); - World world = location.getWorld(); - if (world == null) { - player.sendMessage(error(BasicFunctions.getInstance().i18n("未找到世界!"))); - return; - } - world.setSpawnLocation(location); - player.sendMessage(info(BasicFunctions.getInstance().i18n("已重设世界重生点!"))); - } - - @Override - protected void handleHelp(CommandSender sender) { - sender.sendMessage(ChatColor.RED + "setspawn" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("设置世界重生点")); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpawnCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpawnCommands.java deleted file mode 100644 index 870fa34..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpawnCommands.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.ultikits.plugins.commands; - -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import static com.ultikits.ultitools.utils.MessageUtils.error; - -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"spawn"}, manualRegister = true, permission = "ultikits.tools.command.spawn", description = "重生点功能") -public class SpawnCommands extends AbstractCommendExecutor { - - @CmdMapping(format = "") - public void spawn(@CmdSender Player player) { - if (player.getLocation().getWorld() == null) { - player.sendMessage(error(BasicFunctions.getInstance().i18n("未找到世界!"))); - return; - } - if (player.getLocation().getWorld().getSpawnLocation().equals(new Location(player.getLocation().getWorld(), 0, 0, 0, 0, 0))) { - player.sendMessage(error(BasicFunctions.getInstance().i18n("这个世界没有重生点!"))); - return; - } - player.teleport(player.getLocation().getWorld().getSpawnLocation()); - } - - @Override - protected void handleHelp(CommandSender sender) { - sender.sendMessage(ChatColor.RED + "spawn" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("传送到世界重生点")); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpeedCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpeedCommands.java index 1422f3a..f5e13cb 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpeedCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpeedCommands.java @@ -1,35 +1,53 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.*; +import com.ultikits.ultitools.abstracts.AbstractTabExecutor; import org.bukkit.ChatColor; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.List; import static com.ultikits.ultitools.utils.MessageUtils.info; +import static com.ultikits.ultitools.utils.MessageUtils.warning; -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"speed"}, manualRegister = true, permission = "ultikits.tools.command.speed", description = "速度设置功能") -public class SpeedCommands extends AbstractCommendExecutor { +public class SpeedCommands extends AbstractTabExecutor { List speeds = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); - @CmdMapping(format = "") - public void setSpeeds(@CmdSender Player player, @CmdParam("speed") String speed) { - if (!speeds.contains(speed)) { - return; + @Override + protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { + if (player.hasPermission("ultikits.tools.command.speed")) { + if (!speeds.contains(strings[0])) { + return false; + } + player.setWalkSpeed(Float.parseFloat(strings[0]) / 10); + player.setFlySpeed(Float.parseFloat(strings[0]) / 10); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("行走/飞行速度已设置为%s,默认速度为2"), strings[0])); + return true; + } + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; + } + + @Nullable + @Override + protected List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { + if (!player.hasPermission("ultikits.tools.commands.speed")) { + return null; + } + if (strings.length == 1) { + return speeds; } - player.setWalkSpeed(Float.parseFloat(speed) / 10); - player.setFlySpeed(Float.parseFloat(speed) / 10); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("行走/飞行速度已设置为%s,默认速度为2"), speed)); + return null; } @Override - protected void handleHelp(CommandSender sender) { + protected void sendHelpMessage(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("/speed <0-10> 设置速度"))); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaCommands.java index c5f6b31..b587398 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaCommands.java @@ -2,94 +2,106 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.tasks.TpTimerTask; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.*; +import com.ultikits.ultitools.abstracts.AbstractTabExecutor; import com.ultikits.ultitools.utils.MessageUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import static com.ultikits.ultitools.utils.MessageUtils.info; import static com.ultikits.ultitools.utils.MessageUtils.warning; -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"tpa"}, manualRegister = true, permission = "ultikits.tools.command.tpa", description = "传送请求功能") -public class TpaCommands extends AbstractCommendExecutor { - @CmdMapping(format = "accept") - public void acceptTpa(@CmdSender Player player) { - Player teleporter = TpTimerTask.tpTemp.get(player); - if (teleporter == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); - return; - } - TpTimerTask.tpTemp.put(player, null); - TpTimerTask.tpTimer.put(player, 0); - teleporter.teleport(player.getLocation()); - teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!"))); - } +public class TpaCommands extends AbstractTabExecutor { - @CmdMapping(format = "reject") - public void rejectTpa(@CmdSender Player player) { - Player teleporter = TpTimerTask.tpTemp.get(player); - if (teleporter == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); - return; - } - teleporter.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :("))); - player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!"))); - TpTimerTask.tpTemp.put(player, null); - TpTimerTask.tpTimer.put(player, 0); - } - - @CmdMapping(format = "") - public void tpa(@CmdSender Player player, @CmdParam("player") String targetName) { - Player target = Bukkit.getPlayerExact(targetName); - if (target == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!"))); - return; + @Override + protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { + if (!player.isOp() && !player.hasPermission("ultikits.tools.command.tpa")) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return false; } - if (TpTimerTask.tpTemp.get(target) != null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!"))); - return; + switch (strings.length) { + case 1: + switch (strings[0]) { + case "accept": + Player teleporter = TpTimerTask.tpTemp.get(player); + if (teleporter == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); + return true; + } + TpTimerTask.tpTemp.put(player, null); + TpTimerTask.tpTimer.put(player, 0); + teleporter.teleport(player.getLocation()); + teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!"))); + return true; + case "reject": + Player teleporter2 = TpTimerTask.tpTemp.get(player); + if (teleporter2 == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); + return true; + } + teleporter2.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :("))); + player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!"))); + TpTimerTask.tpTemp.put(player, null); + TpTimerTask.tpTimer.put(player, 0); + return true; + default: + Player target = Bukkit.getPlayerExact(strings[0]); + if (target == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!"))); + return true; + } + if (TpTimerTask.tpTemp.get(target) != null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!"))); + return true; + } + TpTimerTask.tpTemp.put(target, player); + TpTimerTask.tpTimer.put(target, 20); + player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求!"), target.getName()))); + target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求传送到您的位置"), player.getName()))); + TextComponent ask = Component + .text(BasicFunctions.getInstance().i18n("[同意]")) + .color(TextColor.color(0x00FF00)) + .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送"))) + .clickEvent(ClickEvent.runCommand("/tpa accept")) + .append(Component.text(" ")) + .append( + Component + .text(BasicFunctions.getInstance().i18n("[拒绝]")) + .color(TextColor.color(0xFF0000)) + .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送"))) + .clickEvent(ClickEvent.runCommand("/tpa reject")) + ); + MessageUtils.sendMessage(target, ask); + return true; + } + default: + return false; } - TpTimerTask.tpTemp.put(target, player); - TpTimerTask.tpTimer.put(target, 20); - player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求!"), target.getName()))); - target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求传送到您的位置"), player.getName()))); - TextComponent ask = Component - .text(BasicFunctions.getInstance().i18n("[同意]")) - .color(TextColor.color(0x00FF00)) - .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送"))) - .clickEvent(ClickEvent.runCommand("/tpa accept")) - .append(Component.text(" ")) - .append( - Component - .text(BasicFunctions.getInstance().i18n("[拒绝]")) - .color(TextColor.color(0xFF0000)) - .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送"))) - .clickEvent(ClickEvent.runCommand("/tpa reject")) - ); - MessageUtils.sendMessage(target, ask); } @Override - protected List suggest(Player player, String[] strings) { + protected @Nullable + List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { return TpaHereCommands.getTpTabList(strings); } @Override - protected void handleHelp(CommandSender sender) { + protected void sendHelpMessage(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("----传送请求帮助----"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa [玩家名] 向玩家发送传送请求"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa accept 接受传送请求"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa reject 拒绝传送请求"))); } + } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaHereCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaHereCommands.java index 2d8bca6..864154d 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaHereCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaHereCommands.java @@ -2,14 +2,14 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.tasks.TpTimerTask; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.*; +import com.ultikits.ultitools.abstracts.AbstractTabExecutor; import com.ultikits.ultitools.utils.MessageUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -22,9 +22,7 @@ import static com.ultikits.ultitools.utils.MessageUtils.info; import static com.ultikits.ultitools.utils.MessageUtils.warning; -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"tphere"}, manualRegister = true, permission = "ultikits.tools.command.tphere", description = "请求传送到此功能") -public class TpaHereCommands extends AbstractCommendExecutor { +public class TpaHereCommands extends AbstractTabExecutor { @Nullable public static List getTpTabList(@NotNull String[] strings) { List tabCommands = new ArrayList<>(); @@ -39,70 +37,74 @@ public class TpaHereCommands extends AbstractCommendExecutor { return null; } - @CmdMapping(format = "accept") - public void acceptTpa(@CmdSender Player player) { - Player teleporter = TpTimerTask.tphereTemp.get(player); - if (teleporter == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); - return; - } - TpTimerTask.tphereTemp.put(player, null); - TpTimerTask.tphereTimer.put(player, 0); - player.teleport(teleporter.getLocation()); - teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!"))); - } - - @CmdMapping(format = "reject") - public void rejectTpa(@CmdSender Player player) { - Player teleporter = TpTimerTask.tphereTemp.get(player); - if (teleporter == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); - return; - } - teleporter.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :("))); - player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!"))); - TpTimerTask.tphereTemp.put(player, null); - TpTimerTask.tphereTimer.put(player, 0); - } - - @CmdMapping(format = "") - public void tpa(@CmdSender Player player, @CmdParam("player") String targetName) { - Player target = Bukkit.getPlayerExact(targetName); - if (target == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!"))); - return; + @Override + protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { + if (!player.isOp() && !player.hasPermission("ultikits.tools.command.tphere")) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return false; } - if (TpTimerTask.tphereTemp.get(target) != null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!"))); - return; + if (strings.length == 1) { + switch (strings[0]) { + case "accept": + Player teleporter = TpTimerTask.tphereTemp.get(player); + if (teleporter == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); + return true; + } + TpTimerTask.tphereTemp.put(player, null); + TpTimerTask.tphereTimer.put(player, 0); + player.teleport(teleporter.getLocation()); + teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!"))); + return true; + case "reject": + Player teleporter2 = TpTimerTask.tphereTemp.get(player); + if (teleporter2 == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); + return true; + } + teleporter2.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :("))); + player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!"))); + TpTimerTask.tphereTemp.put(player, null); + TpTimerTask.tphereTimer.put(player, 0); + return true; + default: + Player target = Bukkit.getPlayerExact(strings[0]); + if (target == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!"))); + return true; + } + TpTimerTask.tphereTemp.put(target, player); + TpTimerTask.tphereTimer.put(target, 20); + player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求!"), target.getName()))); + target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求您传送至他的位置"), player.getName()))); + TextComponent ask = Component + .text(BasicFunctions.getInstance().i18n("[同意]")) + .color(TextColor.color(0x00FF00)) + .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送"))) + .clickEvent(ClickEvent.runCommand("/tphere accept")) + .append(Component.text(" ")) + .append( + Component + .text(BasicFunctions.getInstance().i18n("[拒绝]")) + .color(TextColor.color(0xFF0000)) + .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送"))) + .clickEvent(ClickEvent.runCommand("/tphere reject")) + ); + MessageUtils.sendMessage(target, ask); + return true; + } } - TpTimerTask.tphereTemp.put(target, player); - TpTimerTask.tphereTimer.put(target, 20); - player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求!"), target.getName()))); - target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求您传送至他的位置"), player.getName()))); - TextComponent ask = Component - .text(BasicFunctions.getInstance().i18n("[同意]")) - .color(TextColor.color(0x00FF00)) - .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送"))) - .clickEvent(ClickEvent.runCommand("/tphere accept")) - .append(Component.text(" ")) - .append( - Component - .text(BasicFunctions.getInstance().i18n("[拒绝]")) - .color(TextColor.color(0xFF0000)) - .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送"))) - .clickEvent(ClickEvent.runCommand("/tphere reject")) - ); - MessageUtils.sendMessage(target, ask); + return false; } + @Nullable @Override - protected List suggest(Player player, String[] strings) { + protected List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { return getTpTabList(strings); } @Override - protected void handleHelp(CommandSender sender) { + protected void sendHelpMessage(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("----传送至此请求帮助----"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tphere accept 接受传送请求"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tphere reject 拒绝传送请求"))); diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WarpCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WarpCommands.java deleted file mode 100644 index b41d019..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WarpCommands.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.ultikits.plugins.commands; - -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.plugins.data.WarpData; -import com.ultikits.plugins.guis.WarpGui; -import com.ultikits.plugins.services.WarpService; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.*; -import com.ultikits.ultitools.services.TeleportService; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.List; - -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"warp"}, manualRegister = true, permission = "ultikits.tools.command.warp", description = "传送点功能") -public class WarpCommands extends AbstractCommendExecutor { - @Autowired - private WarpService warpService; - - @CmdMapping(format = "list") - public void listWarps(@CmdSender Player player) { - WarpGui warpGui = new WarpGui(player); - warpGui.open(); - } - - @CmdMapping(format = "tp ") - public void tpWarp(@CmdSender Player player, @CmdParam("name") String name) { - Location warpLocation = warpService.getWarpLocation(name); - player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已传送至传送点 %s"), name)); - TeleportService teleportService = BasicFunctions.getInstance().getContext().getBean(TeleportService.class); - teleportService.delayTeleport(player, warpLocation, 3); - } - - @CmdMapping(format = "add ", requireOp = true) - public void addWarp(@CmdSender Player player, @CmdParam("name") String name) { - warpService.addWarp(name, player.getLocation()); - player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已添加传送点 %s"), name)); - } - - @CmdMapping(format = "remove ", requireOp = true) - public void removeWarp(@CmdSender Player player, @CmdParam("name") String name) { - warpService.removeWarp(name); - player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已删除传送点 %s"), name)); - } - - @Override - protected List suggest(Player player, String[] strings) { - ArrayList list = new ArrayList<>(); - switch (strings.length) { - case 1: - list.add("list"); - list.add("tp"); - if (player.isOp()) { - list.add("add"); - list.add("remove"); - } - return list; - case 2: - switch (strings[0]) { - case "remove": - if (player.isOp()) { - List allWarps = warpService.getAllWarps(); - for (WarpData warpData : allWarps) { - list.add(warpData.getName()); - } - return list; - } - return list; - case "tp": - List allWarps = warpService.getAllWarps(); - for (WarpData warpData : allWarps) { - list.add(warpData.getName()); - } - return list; - default: - return list; - } - default: - return list; - } - } - - @Override - protected void handleHelp(CommandSender sender) { - sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp list §7- §e查看所有传送点")); - sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp tp §7- §e传送至传送点")); - if (sender.isOp()) { - sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp add §7- §e添加传送点")); - sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp remove §7- §e删除传送点")); - } - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WhitelistCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WhitelistCommands.java index d5780d4..f2637b6 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WhitelistCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WhitelistCommands.java @@ -3,29 +3,39 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.data.WhiteListData; import com.ultikits.plugins.services.WhiteListService; -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; -import org.springframework.beans.factory.annotation.Autowired; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -@CmdTarget(CmdTarget.CmdTargetType.BOTH) -@CmdExecutor(alias = {"wl"}, manualRegister = true, permission = "ultikits.tools.command.whitelist", description = "白名单功能") -public class WhitelistCommands extends AbstractCommendExecutor { - @Autowired - private WhiteListService whiteListService; +import static com.ultikits.ultitools.utils.MessageUtils.warning; + +public class WhitelistCommands implements TabExecutor { + private final WhiteListService whiteListService = new WhiteListService(); @Override - protected void handleHelp(CommandSender sender) { + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { + if (sender instanceof Player) { + Player player = (Player) sender; + if (player.hasPermission("ultikits.tools.admin") || player.hasPermission("ultikits.tools.whitelist")) { + return whiteListCommands(sender, command, args); + } else { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); + return true; + } + } else { + return whiteListCommands(sender, command, args); + } + } + + private void sendHelpMessage(CommandSender sender) { sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("----白名单系统帮助----")); sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl help 白名单帮助")); sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl list 白名单列表")); @@ -33,48 +43,56 @@ public class WhitelistCommands extends AbstractCommendExecutor { sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl remove [玩家名] 将玩家移出白名单")); } - @CmdMapping(format = "help", requireOp = true) - public void help(@CmdSender CommandSender sender) { - handleHelp(sender); - } - - @CmdMapping(format = "list", requireOp = true) - public void list(@CmdSender CommandSender sender) { - List whitelist = whiteListService.getAllWhiteList(); - sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("白名单列表有:")); - for (WhiteListData each : whitelist) { - sender.sendMessage(String.format("- %s", each.getName())); + private boolean whiteListCommands(CommandSender sender, Command command, String[] args) { + if ("wl".equalsIgnoreCase(command.getName())) { + if (args.length == 1) { + switch (args[0]) { + case "help": + sendHelpMessage(sender); + return true; + case "list": + List whitelist = whiteListService.getAllWhiteList(); + sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("白名单列表有:")); + for (WhiteListData each : whitelist) { + sender.sendMessage(String.format("- %s", each.getName())); + } + return true; + default: + return false; + } + } else if (args.length == 2) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(args[1]); + if ("add".equalsIgnoreCase(args[0])) { + whiteListService.addWhiteList(String.valueOf(offlinePlayer.getUniqueId()), args[1]); + sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s加入白名单!"), args[1])); + return true; + } else if ("remove".equalsIgnoreCase(args[0])) { + whiteListService.removeWhiteList(String.valueOf(offlinePlayer.getUniqueId())); + sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s移出白名单!"), args[1])); + return true; + } + } } - } - - @CmdMapping(format = "add ", requireOp = true) - public void add(@CmdSender CommandSender sender, String name) { - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name); - whiteListService.addWhiteList(String.valueOf(offlinePlayer.getUniqueId()), name); - sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s加入白名单!"), name)); - } - - @CmdMapping(format = "remove ", requireOp = true) - public void remove(@CmdSender CommandSender sender, String name) { - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name); - whiteListService.removeWhiteList(String.valueOf(offlinePlayer.getUniqueId())); - sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s移出白名单!"), name)); + return false; } @Override - protected List suggest(Player player, String[] strings) { - if (player.isOp() || player.hasPermission("ultikits.tools.whitelist")) { - if (strings.length == 1) { - List tabCommands = new ArrayList<>(); - tabCommands.add("help"); - tabCommands.add("list"); - tabCommands.add("add"); - tabCommands.add("remove"); - return tabCommands; - } else if (strings.length == 2) { - List tabCommands = new ArrayList<>(); - tabCommands.add(BasicFunctions.getInstance().i18n("[玩家名]")); - return tabCommands; + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { + if (sender instanceof Player) { + Player player = (Player) sender; + if (player.isOp() || player.hasPermission("ultikits.tools.whitelist")) { + if (args.length == 1) { + List tabCommands = new ArrayList<>(); + tabCommands.add("help"); + tabCommands.add("list"); + tabCommands.add("add"); + tabCommands.add("remove"); + return tabCommands; + } else if (args.length == 2) { + List tabCommands = new ArrayList<>(); + tabCommands.add(BasicFunctions.getInstance().i18n("[玩家名]")); + return tabCommands; + } } } return null; diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/config/BasicConfig.java b/BasicFunctions/src/main/java/com/ultikits/plugins/config/BasicConfig.java index 74ccc8e..322cea3 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/config/BasicConfig.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/config/BasicConfig.java @@ -30,18 +30,6 @@ public class BasicConfig extends AbstractConfigEntity { private boolean enableSpeed = true; @ConfigEntry(path = "enableBan", comment = "是否启用封禁") private boolean enableBan = true; - @ConfigEntry(path = "enableBan", comment = "是否启用传送点") - private boolean enableWarp = true; - @ConfigEntry(path = "enableSpawn", comment = "是否启用重生点设置") - private boolean enableSpawn = true; - @ConfigEntry(path = "enableLoreEditor", comment = "是否启用Lore编辑器") - private boolean enableLoreEditor = true; - @ConfigEntry(path = "enableHide", comment = "是否启用隐身功能") - private boolean enableHide = true; - @ConfigEntry(path = "enableTitle", comment = "是否启用头顶显示功能") - private boolean enableTitle = true; - @ConfigEntry(path = "enableDeathPunishment", comment = "是否启用死亡惩罚功能") - private boolean enableDeathPunishment = true; public BasicConfig(String configFilePath) { super(configFilePath); diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/config/DeathPunishmentConfig.java b/BasicFunctions/src/main/java/com/ultikits/plugins/config/DeathPunishmentConfig.java deleted file mode 100644 index 24f3254..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/config/DeathPunishmentConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ultikits.plugins.config; - -import com.ultikits.ultitools.abstracts.AbstractConfigEntity; -import com.ultikits.ultitools.annotations.ConfigEntity; -import com.ultikits.ultitools.annotations.ConfigEntry; -import lombok.Getter; -import lombok.Setter; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -@Getter -@Setter -@ConfigEntity("config/death.yml") -public class DeathPunishmentConfig extends AbstractConfigEntity { - @ConfigEntry(path = "enable_item_drop", comment = "是否开启物品掉落") - private boolean enableItemDrop = false; - @ConfigEntry(path = "enable_money_drop", comment = "是否开启金币掉落") - private boolean enableMoneyDrop = true; - @ConfigEntry(path = "enable_punish_commands", comment = "是否开启死亡执行后台命令") - private boolean enablePunishCommands = true; - @ConfigEntry(path = "money_dropped_ondeath", comment = "死亡后掉落的金币数") - private int moneyDropOnDeath = 100; - @ConfigEntry(path = "item_dropped_ondeath", comment = "死亡后随机掉落的物品数") - private int itemDropOnDeath = 3; - @ConfigEntry(path = "punish_commands", comment = "死亡后后台执行的指令({PLAYER}指代玩家名占位符)") - private List punishCommands = Collections.emptyList(); - @ConfigEntry(path = "worlds_enabled_item_drop", comment = "开启死亡随机物品掉落的世界") - private List worldEnabledItemDrop = Arrays.asList("world", "world_nether", "world_the_end"); - @ConfigEntry(path = "worlds_enabled_money_drop", comment = "开启死亡后金币掉落的世界") - private List worldEnabledMoneyDrop = Arrays.asList("world", "world_nether", "world_the_end"); - @ConfigEntry(path = "worlds_enabled_punish_commands", comment = "开启死亡后执行后台指令的世界") - private List worldEnabledPunishCommands = Arrays.asList("world", "world_nether", "world_the_end"); - @ConfigEntry(path = "item_drop_whitelist", comment = "物品掉落白名单") - private List itemDropWhiteList = Collections.emptyList(); - - public DeathPunishmentConfig(String configFilePath) { - super(configFilePath); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/config/PlayerNameTagConfig.java b/BasicFunctions/src/main/java/com/ultikits/plugins/config/PlayerNameTagConfig.java deleted file mode 100644 index 4183ec2..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/config/PlayerNameTagConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.ultikits.plugins.config; - -import com.ultikits.ultitools.abstracts.AbstractConfigEntity; -import com.ultikits.ultitools.annotations.ConfigEntity; -import com.ultikits.ultitools.annotations.ConfigEntry; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@ConfigEntity("config/title.yml") -public class PlayerNameTagConfig extends AbstractConfigEntity { - @ConfigEntry(path = "prefix", comment = "玩家名字前缀") - private String prefix = "&e[&dLv.%player_level%&e]"; - @ConfigEntry(path = "suffix", comment = "玩家名字后缀") - private String suffix = "&e[&a%player_health_rounded%&e/&a%player_max_health_rounded%&e]"; - @ConfigEntry(path = "updateInterval", comment = "更新间隔") - private int updateInterval = 20; - @ConfigEntry(path = "enableNameTagEdit", comment = "是否启用NameTagEdit支持") - private boolean enableNameTagEdit = false; - - public PlayerNameTagConfig(String configFilePath) { - super(configFilePath); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/config/WarpConfig.java b/BasicFunctions/src/main/java/com/ultikits/plugins/config/WarpConfig.java deleted file mode 100644 index 16458bf..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/config/WarpConfig.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.ultikits.plugins.config; - -import com.ultikits.ultitools.abstracts.AbstractConfigEntity; -import com.ultikits.ultitools.annotations.ConfigEntity; -import com.ultikits.ultitools.annotations.ConfigEntry; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@ConfigEntity("config/warp.yml") -public class WarpConfig extends AbstractConfigEntity { - @ConfigEntry(path = "enable_blue_map", comment = "是否启用BlueMap") - private boolean enableBlueMap = false; - @ConfigEntry(path = "blue_map_warp_max_distance", comment = "传送点在BlueMap中最远显示距离") - private int maxDistance = 1000; - @ConfigEntry(path = "blue_map_marker_set", comment = "传送点在BlueMap中的标记集名称") - private String markerSet = "UltiTools Warps"; - - public WarpConfig(String configFilePath) { - super(configFilePath); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/data/WarpData.java b/BasicFunctions/src/main/java/com/ultikits/plugins/data/WarpData.java deleted file mode 100644 index e8dc2f8..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/data/WarpData.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.ultikits.plugins.data; - -import com.ultikits.ultitools.abstracts.AbstractDataEntity; -import com.ultikits.ultitools.annotations.Column; -import com.ultikits.ultitools.annotations.Table; -import com.ultikits.ultitools.entities.common.WorldLocation; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.bukkit.Location; - -import java.util.Date; - -@Data -@Table("warp_table") -@EqualsAndHashCode(callSuper = true) -public class WarpData extends AbstractDataEntity { - @Column("id") - private Long id = new Date().getTime(); - @Column("name") - private String name; - @Column("location") - private WorldLocation location; -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/data/WhiteListData.java b/BasicFunctions/src/main/java/com/ultikits/plugins/data/WhiteListData.java index 4c98f7c..b57d382 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/data/WhiteListData.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/data/WhiteListData.java @@ -14,6 +14,4 @@ public class WhiteListData extends AbstractDataEntity { private String id; @Column("name") private String name; - @Column("remark") - private String remark; } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/guis/WarpGui.java b/BasicFunctions/src/main/java/com/ultikits/plugins/guis/WarpGui.java deleted file mode 100644 index a1fe765..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/guis/WarpGui.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.ultikits.plugins.guis; - -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.plugins.data.WarpData; -import com.ultikits.plugins.services.WarpService; -import com.ultikits.ultitools.UltiTools; -import com.ultikits.ultitools.abstracts.guis.PagingPage; -import mc.obliviate.inventory.Icon; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.TextComponent; -import net.kyori.adventure.text.format.TextColor; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import java.util.ArrayList; -import java.util.List; - -public class WarpGui extends PagingPage { - private final WarpService warpService = new WarpService(); - - public WarpGui(Player player) { - super( - player, - "Warp-list", - Component.text(BasicFunctions.getInstance().i18n("传送点列表")) - .color(TextColor.color(0xFF00A6)), - 3 - ); - } - - @Override - public List setAllItems() { - List icons = new ArrayList<>(); - List allWarps = warpService.getAllWarps(); - for (WarpData warpData : allWarps) { - Location location = WarpService.toLocation(warpData.getLocation()); - Icon icon = new Icon(UltiTools.getInstance().getVersionWrapper().getEndEye()); - TextComponent textComponent = Component.text(warpData.getName()).color(TextColor.color(0xFF00A6)); - icon.toComp().setName(textComponent); - String world = String.format(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("所在世界 %s"), location.getWorld().getName()); - String xyz = String.format(ChatColor.GRAY + "X: %.2f Y: %.2f Z: %.2f", location.getX(), location.getY(), location.getZ()); - icon.setLore(world, xyz); - icon.onClick((e) -> { - player.performCommand("warp tp " + warpData.getName()); - player.closeInventory(); - }); - icons.add(icon); - } - return icons; - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BackListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BackListener.java index 9bbc817..5aeb3ef 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BackListener.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BackListener.java @@ -1,6 +1,5 @@ package com.ultikits.plugins.listeners; -import com.ultikits.ultitools.annotations.EventListener; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -11,7 +10,6 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; -@EventListener(manualRegister = true) public class BackListener implements Listener { private static final Map playerDeathLocation = new HashMap<>(); diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BanListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BanListener.java index 2e8254b..0b748a3 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BanListener.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BanListener.java @@ -1,16 +1,12 @@ package com.ultikits.plugins.listeners; import com.ultikits.plugins.services.BanPlayerService; -import com.ultikits.ultitools.annotations.EventListener; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.springframework.beans.factory.annotation.Autowired; -@EventListener(manualRegister = true) public class BanListener implements Listener { - @Autowired - private BanPlayerService banPlayerService; + private BanPlayerService banPlayerService = new BanPlayerService(); @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/DeathListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/DeathListener.java deleted file mode 100644 index 253d4d1..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/DeathListener.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.ultikits.plugins.listeners; - -import com.ultikits.plugins.tasks.DeathPunishmentTask; -import com.ultikits.ultitools.annotations.EventListener; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.PlayerDeathEvent; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author qianmo, wisdomme - */ -@EventListener(manualRegister = true) -public class DeathListener implements Listener { - private static final List list = new ArrayList<>(); - @Autowired - private DeathPunishmentTask deathPunishmentTask; - - @EventHandler - public void onPlayerDeath(PlayerDeathEvent event) { - Player player = event.getEntity(); - if (list.contains(player)) { - list.remove(player); - deathPunishmentTask.addPlayerToQueue(player); - } - } - - @EventHandler - public void onEntityDamage(EntityDamageEvent event) { - if (!(event.getEntity() instanceof Player)) { - return; - } - Player player = (Player) event.getEntity(); - - if (player.getHealth() > event.getFinalDamage()) { - return; - } - list.add(player); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/HideListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/HideListener.java deleted file mode 100644 index c2c2c33..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/HideListener.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.ultikits.plugins.listeners; - -import com.ultikits.plugins.commands.HideCommands; -import com.ultikits.ultitools.annotations.EventListener; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerQuitEvent; - -@EventListener(manualRegister = true) -public class HideListener implements Listener { - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - HideCommands.removeHidePlayer(event.getPlayer().getUniqueId()); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/JoinWelcomeListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/JoinWelcomeListener.java index 687301e..66ad6af 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/JoinWelcomeListener.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/JoinWelcomeListener.java @@ -3,7 +3,6 @@ package com.ultikits.plugins.listeners; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.config.JoinWelcomeConfig; import com.ultikits.ultitools.UltiTools; -import com.ultikits.ultitools.annotations.EventListener; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -15,7 +14,6 @@ import org.bukkit.scheduler.BukkitRunnable; import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; -@EventListener(manualRegister = true) public class JoinWelcomeListener implements Listener { @EventHandler diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/PlayerNameTagListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/PlayerNameTagListener.java deleted file mode 100644 index 862078a..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/PlayerNameTagListener.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.ultikits.plugins.listeners; - -import com.nametagedit.plugin.NametagEdit; -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.plugins.config.PlayerNameTagConfig; -import com.ultikits.plugins.utils.TitlesUtils; -import com.ultikits.ultitools.annotations.EventListener; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; - -import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; - -@EventListener(manualRegister = true) -public class PlayerNameTagListener implements Listener { - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - Player player = event.getPlayer(); - PlayerNameTagConfig nameTagConfig = BasicFunctions.getInstance().getConfig(PlayerNameTagConfig.class); - String prefix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getPrefix())); - String suffix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getSuffix())); - if (nameTagConfig.isEnableNameTagEdit()) { - NametagEdit.getApi().updatePlayerNametag(player.getName(), prefix, suffix); - } else { - TitlesUtils.setPrefixSuffix(player, prefix, suffix); - } - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/WhitelistListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/WhitelistListener.java index bfd2e4a..154449a 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/WhitelistListener.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/WhitelistListener.java @@ -2,18 +2,14 @@ package com.ultikits.plugins.listeners; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.services.WhiteListService; -import com.ultikits.ultitools.annotations.EventListener; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerLoginEvent; -import org.springframework.beans.factory.annotation.Autowired; -@EventListener(manualRegister = true) public class WhitelistListener implements Listener { - @Autowired - private WhiteListService whiteListService; + private final WhiteListService whiteListService = new WhiteListService(); @EventHandler public void onPlayerLogin(PlayerLoginEvent event) { diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/services/DeathPunishService.java b/BasicFunctions/src/main/java/com/ultikits/plugins/services/DeathPunishService.java deleted file mode 100644 index 938606b..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/services/DeathPunishService.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ultikits.plugins.services; - -import com.ultikits.ultitools.UltiTools; -import net.milkbowl.vault.economy.Economy; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * @author qianmo, wisdomme - */ -@Service -public class DeathPunishService { - public void takeMoney(Player player, int money) { - Economy economy = UltiTools.getInstance().getEconomy(); - economy.withdrawPlayer(player, Math.min(economy.getBalance(player), money)); - } - - public void execCommand(List cmd, String playerName) { - for (String s : cmd) { - Bukkit.getServer().dispatchCommand( - Bukkit.getServer().getConsoleSender(), s.replace("{PLAYER}", playerName) - ); - } - } - - public void takeItem(Player player, int drop, List whitelist) { - Inventory inventory = player.getInventory(); - List inventorySlot = new ArrayList<>(); - for (int i = 0; i < 45; i++) { - ItemStack item = inventory.getItem(i); - if (item != null && !whitelist.contains(item.getType().toString())) { - inventorySlot.add(i); - } - } - Collections.shuffle(inventorySlot); - List ints = new ArrayList<>(); - for (int i = 0; i < drop; i++) { - if (i >= inventorySlot.size()) break; - ints.add(inventorySlot.get(i)); - } - for (Integer slot : ints) { - ItemStack itemStack = inventory.getItem(slot); - if (itemStack == null) continue; - itemStack.setAmount(itemStack.getAmount() - 1); - inventory.setItem(slot, itemStack); - } - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/services/WarpService.java b/BasicFunctions/src/main/java/com/ultikits/plugins/services/WarpService.java deleted file mode 100644 index d6dda08..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/services/WarpService.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.ultikits.plugins.services; - -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.plugins.config.WarpConfig; -import com.ultikits.plugins.data.WarpData; -import com.ultikits.ultitools.entities.WhereCondition; -import com.ultikits.ultitools.entities.common.WorldLocation; -import de.bluecolored.bluemap.api.BlueMapAPI; -import de.bluecolored.bluemap.api.BlueMapMap; -import de.bluecolored.bluemap.api.markers.MarkerSet; -import de.bluecolored.bluemap.api.markers.POIMarker; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.springframework.stereotype.Service; - -import java.util.List; - -import static com.ultikits.ultitools.abstracts.UltiToolsPlugin.getConfigManager; - -@Service -public class WarpService { - - public static Location toLocation(WorldLocation worldLocation) { - return new Location(Bukkit.getWorld(worldLocation.getWorld()), worldLocation.getX(), worldLocation.getY(), worldLocation.getZ(), worldLocation.getYaw(), worldLocation.getPitch()); - } - - public void addWarp(String name, Location location) { - WarpData warpData = new WarpData(); - warpData.setName(name); - WorldLocation worldLocation = new WorldLocation(location); - warpData.setLocation(worldLocation); - BasicFunctions.getInstance().getDataOperator(WarpData.class).insert(warpData); - addWarpToBlueMap(warpData); - } - - public void removeWarp(String name) { - List warpData = BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll( - WhereCondition.builder().column("name").value(name).build() - ); - if (warpData.isEmpty()) { - return; - } - BasicFunctions.getInstance().getDataOperator(WarpData.class).del( - WhereCondition.builder().column("name").value(name).build() - ); - removeWarpFromBlueMap(warpData.get(0)); - } - - public Location getWarpLocation(String name) { - List warpData = BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll( - WhereCondition.builder().column("name").value(name).build() - ); - if (warpData.isEmpty()) { - return null; - } - return toLocation(warpData.get(0).getLocation()); - } - - public List getAllWarps() { - return BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll(); - } - - public void initBlueMap(){ - WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class); - if (!warpConfig.isEnableBlueMap()) { - return; - } - BlueMapAPI.getInstance().ifPresent(api -> { - api.getWorlds().forEach(world -> { - for (BlueMapMap map : world.getMaps()) { - MarkerSet markerSet = MarkerSet.builder() - .label(warpConfig.getMarkerSet()) - .build(); - map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet); - } - }); - }); - for (WarpData warpData : getAllWarps()) { - addWarpToBlueMap(warpData); - } - } - - public void addWarpToBlueMap(WarpData warpData) { - WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class); - if (!warpConfig.isEnableBlueMap()) { - return; - } - WorldLocation location = warpData.getLocation(); - POIMarker marker = POIMarker.builder() - .label(warpData.getName()) - .position(location.getX(), location.getY(), location.getZ()) - .maxDistance(warpConfig.getMaxDistance()) - .build(); - - BlueMapAPI.getInstance().flatMap(api -> api.getWorld(location.getWorld())).ifPresent(world -> { - for (BlueMapMap map : world.getMaps()) { - MarkerSet markerSet = map.getMarkerSets().get(warpConfig.getMarkerSet()); - markerSet.getMarkers().put(String.valueOf(warpData.getId()), marker); - map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet); - } - }); - } - - public void removeWarpFromBlueMap(WarpData warpData) { - WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class); - if (!warpConfig.isEnableBlueMap()) { - return; - } - BlueMapAPI.getInstance().flatMap(api -> api.getWorld(warpData.getLocation().getWorld())).ifPresent(world -> { - for (BlueMapMap map : world.getMaps()) { - MarkerSet markerSet = map.getMarkerSets().get(warpConfig.getMarkerSet()); - markerSet.remove(String.valueOf(warpData.getId())); -// map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet); - } - }); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/services/WhiteListService.java b/BasicFunctions/src/main/java/com/ultikits/plugins/services/WhiteListService.java index 52d383f..0094b44 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/services/WhiteListService.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/services/WhiteListService.java @@ -4,11 +4,9 @@ import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.data.WhiteListData; import com.ultikits.ultitools.entities.WhereCondition; import com.ultikits.ultitools.interfaces.DataOperator; -import org.springframework.stereotype.Service; import java.util.List; -@Service public class WhiteListService { public boolean isWhiteList(String uuid) { diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/DeathPunishmentTask.java b/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/DeathPunishmentTask.java deleted file mode 100644 index 985ecee..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/DeathPunishmentTask.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.ultikits.plugins.tasks; - -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.plugins.config.DeathPunishmentConfig; -import com.ultikits.plugins.services.DeathPunishService; -import com.ultikits.ultitools.UltiTools; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.stereotype.Service; - -import java.util.*; - -@Service -public class DeathPunishmentTask { - protected List punishQueue = new ArrayList<>(); - @Autowired - private DeathPunishService deathPunishService; - - public DeathPunishmentTask() { - DeathPunishmentConfig deathPunishmentConfig = UltiTools.getInstance().getConfigManager().getConfigEntity(BasicFunctions.getInstance(), DeathPunishmentConfig.class); - new BukkitRunnable() { - @Override - public void run() { - Iterator iterator = punishQueue.iterator(); - while (iterator.hasNext()) { - UUID uuid; - try { - uuid = iterator.next(); - } catch (ConcurrentModificationException e) { - continue; - } - Player player = Bukkit.getPlayer(uuid); - if (player == null) { - continue; - } - String world = player.getWorld().getName(); - List list; - if (deathPunishmentConfig.isEnableItemDrop()) { - list = deathPunishmentConfig.getWorldEnabledItemDrop(); - for (String s : list) { - if (s.equals(world)) { - int itemDropOnDeath = deathPunishmentConfig.getItemDropOnDeath(); - deathPunishService.takeItem(player, itemDropOnDeath, deathPunishmentConfig.getItemDropWhiteList()); - player.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("[死亡惩罚]你因为死亡随机掉落了%d个物品!"), itemDropOnDeath)); - } - } - } - - if (deathPunishmentConfig.isEnableMoneyDrop()) { - list = deathPunishmentConfig.getWorldEnabledMoneyDrop(); - for (String s : list) { - if (s.equals(world)) { - int moneyDropOnDeath = deathPunishmentConfig.getMoneyDropOnDeath(); - deathPunishService.takeMoney(player, moneyDropOnDeath); - player.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("[死亡惩罚]你因为死亡而扣除了%d个金币!"), moneyDropOnDeath)); - } - } - } - - if (deathPunishmentConfig.isEnablePunishCommands()) { - list = deathPunishmentConfig.getWorldEnabledPunishCommands(); - for (String s : list) { - if (s.equals(world)) { - UltiTools.getInstance().getServer().getScheduler().callSyncMethod(UltiTools.getInstance(), () -> { - deathPunishService.execCommand(deathPunishmentConfig.getPunishCommands(), player.getName()); - return null; - }); - } - } - } - punishQueue.remove(uuid); - } - } - }.runTaskTimerAsynchronously(UltiTools.getInstance(), 0, 20); - } - - public void addPlayerToQueue(Player player) { - if (punishQueue.contains(player.getUniqueId())) { - return; - } - punishQueue.add(player.getUniqueId()); - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/NamePrefixSuffixTask.java b/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/NamePrefixSuffixTask.java deleted file mode 100644 index a131187..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/NamePrefixSuffixTask.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ultikits.plugins.tasks; - -import com.nametagedit.plugin.NametagEdit; -import com.ultikits.plugins.BasicFunctions; -import com.ultikits.plugins.config.PlayerNameTagConfig; -import com.ultikits.plugins.utils.TitlesUtils; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.scheduler.BukkitRunnable; - -import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; - -public class NamePrefixSuffixTask extends BukkitRunnable { - - @Override - public void run() { - PlayerNameTagConfig nameTagConfig = BasicFunctions.getInstance().getConfig(PlayerNameTagConfig.class); - for (Player player : Bukkit.getOnlinePlayers()) { - String prefix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getPrefix())); - String suffix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getSuffix())); - if (nameTagConfig.isEnableNameTagEdit()){ - NametagEdit.getApi().updatePlayerNametag(player.getName(), prefix, suffix); - }else { - TitlesUtils.setPrefixSuffix(player, prefix, suffix); - } - } - } -} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/utils/TitlesUtils.java b/BasicFunctions/src/main/java/com/ultikits/plugins/utils/TitlesUtils.java deleted file mode 100644 index 373d827..0000000 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/utils/TitlesUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.ultikits.plugins.utils; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.scoreboard.Scoreboard; -import org.bukkit.scoreboard.Team; - -public class TitlesUtils { - - public static void setPrefixSuffix(Player player, String prefix, String suffix) { - for (Player online : Bukkit.getOnlinePlayers()) { - if (!online.canSee(player)) { - continue; - } - Scoreboard scoreboard = online.getScoreboard(); - if (scoreboard == Bukkit.getScoreboardManager().getMainScoreboard()) { - scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); - } - Team team = scoreboard.getTeam(player.getName()); - if (team == null) { - team = scoreboard.registerNewTeam(player.getName()); - } - team.setPrefix(prefix); - team.setSuffix(suffix); - team.addEntry(player.getName()); - online.setScoreboard(scoreboard); - } - for (Player online : Bukkit.getOnlinePlayers()) { - if (!online.canSee(player)) { - continue; - } - if (online.getUniqueId().equals(player.getUniqueId())) - continue; - Scoreboard scoreboard = player.getScoreboard(); - if (scoreboard == Bukkit.getScoreboardManager().getMainScoreboard()) { - scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); - } - Team team = scoreboard.getTeam(online.getName()); - if (team == null) { - team = scoreboard.registerNewTeam(online.getName()); - } - - team.setPrefix(player.getScoreboard().getTeam(online.getName()).getPrefix()); - team.setSuffix(player.getScoreboard().getTeam(online.getName()).getSuffix()); - team.addEntry(online.getName()); - player.setScoreboard(scoreboard); - } - } -} diff --git a/BasicFunctions/src/main/resources/config/config.yml b/BasicFunctions/src/main/resources/config/config.yml index 598be9b..004f480 100644 --- a/BasicFunctions/src/main/resources/config/config.yml +++ b/BasicFunctions/src/main/resources/config/config.yml @@ -18,15 +18,3 @@ enableTpa: true enableSpeed: true # 是否启用封禁功能 enableBan: true -# 是否启用封禁功能 -enableWarp: true -# 是否启用重生点设置 -enableSpawn: true -# 是否启用Lore编辑器 -enableLoreEditor: true -# 是否启用隐身功能 -enableHide: true -# 是否启用玩家头顶显示功能 -enableTitle: true -# 是否启用死亡惩罚功能 -enableDeathPunishment: true diff --git a/BasicFunctions/src/main/resources/config/death.yml b/BasicFunctions/src/main/resources/config/death.yml deleted file mode 100644 index 3f3bf2c..0000000 --- a/BasicFunctions/src/main/resources/config/death.yml +++ /dev/null @@ -1,38 +0,0 @@ -# 是否开启物品掉落 -enable_item_drop: false - -# 是否开启金币掉落 -enable_money_drop: true - -# 是否开启死亡执行后台命令 -enable_punish_commands: true - -# 死亡后掉落的金币数 -money_dropped_ondeath: 100 - -# 死亡后随机掉落的物品数 -item_dropped_ondeath: 3 - -# 死亡后后台执行的指令({PLAYER}指代玩家名占位符) -punish_commands: [] - -# 开启死亡随机物品掉落的世界 -worlds_enabled_item_drop: - - world - - world_nether - - world_the_end - -# 开启死亡后金币掉落的世界 -worlds_enabled_money_drop: - - world - - world_nether - - world_the_end - -# 开启死亡后执行后台指令的世界 -worlds_enabled_punish_commands: - - world - - world_nether - - world_the_end - -# 物品掉落白名单 -item_drop_whitelist: [] diff --git a/BasicFunctions/src/main/resources/config/title.yml b/BasicFunctions/src/main/resources/config/title.yml deleted file mode 100644 index 32ab018..0000000 --- a/BasicFunctions/src/main/resources/config/title.yml +++ /dev/null @@ -1,8 +0,0 @@ -# 玩家名前缀 -prefix: "&e[&dLv.%player_level%&e]" -# 玩家名后缀 -suffix: "&e[&a%player_health_rounded%&e/&a%player_max_health_rounded%&e]" -# 玩家头顶显示更新间隔(单位:tick,一般20代表1秒) -updateInterval: 20 -# 是否启用Nametagedit插件支持 -enableNameTagEdit: false diff --git a/BasicFunctions/src/main/resources/config/warp.yml b/BasicFunctions/src/main/resources/config/warp.yml deleted file mode 100644 index 65a5476..0000000 --- a/BasicFunctions/src/main/resources/config/warp.yml +++ /dev/null @@ -1,6 +0,0 @@ -# 是否启用BlueMap,自行安装BlueMap插件 -enable_blue_map: false -# 传送点在BlueMap中最远显示距离 -blue_map_warp_max_distance: 1000 -# 传送点在BlueMap中的标记集名称 -blue_map_marker_set: "UltiTools Warps" diff --git a/BasicFunctions/src/main/resources/lang/en.json b/BasicFunctions/src/main/resources/lang/en.json index 8baf27e..98f9f44 100644 --- a/BasicFunctions/src/main/resources/lang/en.json +++ b/BasicFunctions/src/main/resources/lang/en.json @@ -57,38 +57,5 @@ "速度设置功能": "Speed setting function", "你已被封禁! 原因: %s": "You have been banned! Reason: %s", "§a封禁成功!": "§aBanned successfully!", - "§a解封成功!": "§aUnbanned successfully!", - "传送点功能": "Teleport point function", - "§a已添加传送点 %s": "§aTeleport point %s has been added", - "§a已删除传送点 %s": "§aTeleport point %s has been deleted", - "§a/warp list §7- §e查看所有传送点": "§a/warp list §7- §eView all teleport points", - "§a/warp tp §7- §e传送至传送点": "§a/warp tp §7- §eTeleport to teleport point", - "§a/warp add §7- §e添加传送点": "§a/warp add §7- §eAdd teleport point", - "§a/warp remove §7- §e删除传送点": "§a/warp remove §7- §eDelete teleport point", - "所在世界 %s": "World: %s", - "传送点列表": "Teleport point list", - "未找到世界!": "World not found!", - "这个世界没有重生点!": "This world has no respawn point!", - "已重设世界重生点!": "World respawn point has been reset!", - "传送到世界重生点": "Teleport to world respawn point", - "重生点功能": "Spawn point function", - "设置世界重生点": "Set world respawn point", - "请手持物品来修改Lore": "Please hold the item to modify the Lore", - "物品Lore为空": "Item Lore is empty", - "物品Lore已修改": "Item Lore has been modified", - "物品Lore编辑功能": "Item Lore editing function", - "添加Lore": "Add Lore", - "删除Lore": "Delete Lore", - "修改Lore": "Modify Lore", - "<内容>": "", - "<- 请输入对应的lore行数": "<- Please enter the lore line number", - "你已退出隐身": "You are not invisible now", - "你已进入隐身": "You are invisible now", - "隐身功能": "Invisible function", - "/hide - 开启/关闭隐身": "/hide - Turn on/off invisible", - "§c/uban ban §7封禁玩家": "§c/uban ban §7Ban player", - "§c/uban unban §7解封玩家": "§c/uban unban §7Unban player", - "§c/heal §7治愈自己": "§c/heal §7Heal yourself", - "[死亡惩罚]你因为死亡随机掉落了%d个物品!": "[Death penalty] You randomly dropped %d items due to death!", - "[死亡惩罚]你因为死亡而扣除了%d个金币!": "[Death penalty] You deducted %d coins due to death!" + "§a解封成功!": "§aUnbanned successfully!" } diff --git a/BasicFunctions/src/main/resources/plugin.yml b/BasicFunctions/src/main/resources/plugin.yml index e4a4dd5..9ad3818 100644 --- a/BasicFunctions/src/main/resources/plugin.yml +++ b/BasicFunctions/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: BasicFunctions version: '${project.version}' main: com.ultikits.plugins.BasicFunctions -api-version: 605 +api-version: 600 authors: [ 'wisdomme' ] diff --git a/Economy/pom.xml b/Economy/pom.xml index 7276f1e..26360ab 100644 --- a/Economy/pom.xml +++ b/Economy/pom.xml @@ -21,7 +21,7 @@ com.ultikits UltiTools-API - 6.0.5 + 6.0.3 provided @@ -78,7 +78,7 @@ UltiEconomy UltiEconomy - 多账户,利息发放,多人共享账户的经济模块 + A Economy Plugin access_key.txt F:\SpigotServers\Servers\1.19.4\plugins\UltiTools\plugins diff --git a/Home/pom.xml b/Home/pom.xml index 53ef738..f69897e 100755 --- a/Home/pom.xml +++ b/Home/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> UltiTools-Home com.ultikits.plugins - 1.0.2 + 1.0.0 4.0.0 @@ -18,7 +18,7 @@ com.ultikits UltiTools-API - 6.0.5 + 6.0.3 provided @@ -55,9 +55,9 @@ UltiTools-Home UltiTools-Home - 可视化GUI家模块 + A Home Plugin access_key.txt - F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins + F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins diff --git a/Home/src/main/java/com/ultikits/plugins/home/PluginMain.java b/Home/src/main/java/com/ultikits/plugins/home/PluginMain.java index e44c2d5..d189de1 100644 --- a/Home/src/main/java/com/ultikits/plugins/home/PluginMain.java +++ b/Home/src/main/java/com/ultikits/plugins/home/PluginMain.java @@ -3,14 +3,20 @@ package com.ultikits.plugins.home; import com.ultikits.plugins.home.config.HomeConfig; import com.ultikits.plugins.home.entity.HomeEntity; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; -import com.ultikits.ultitools.annotations.UltiToolsModule; +import com.ultikits.ultitools.annotations.EnableAutoRegister; +import com.ultikits.ultitools.annotations.I18n; import com.ultikits.ultitools.interfaces.DataOperator; import com.ultikits.ultitools.interfaces.DataStore; import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.stereotype.Component; -@UltiToolsModule +@Component +@ComponentScan +@I18n({"zh", "en"}) +@EnableAutoRegister public class PluginMain extends UltiToolsPlugin { @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") @Autowired diff --git a/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java b/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java index 7c0c0ae..ab48092 100644 --- a/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java +++ b/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java @@ -8,6 +8,7 @@ import com.ultikits.ultitools.annotations.command.*; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.Arrays; @@ -16,11 +17,9 @@ import java.util.List; @CmdTarget(CmdTarget.CmdTargetType.PLAYER) @CmdExecutor(permission = "ultikits.home.command.all", description = "家功能", alias = {"home"}) public class HomeCommands extends AbstractCommendExecutor { - private final HomeService homeService; - - public HomeCommands(HomeService homeService) { - this.homeService = homeService; - } + @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") + @Autowired + private HomeService homeService; @CmdMapping(format = "list") public void openList(@CmdSender Player player) { diff --git a/Home/src/main/java/com/ultikits/plugins/home/gui/HomeListGui.java b/Home/src/main/java/com/ultikits/plugins/home/gui/HomeListGui.java index 3fd597a..7bf384a 100644 --- a/Home/src/main/java/com/ultikits/plugins/home/gui/HomeListGui.java +++ b/Home/src/main/java/com/ultikits/plugins/home/gui/HomeListGui.java @@ -16,7 +16,6 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; import java.util.List; public class HomeListGui extends PagingPage { @@ -38,7 +37,6 @@ public class HomeListGui extends PagingPage { public List setAllItems() { List icons = new ArrayList<>(); List homeList = home.getHomeList(player.getUniqueId()); - homeList.sort(Comparator.comparing(HomeEntity::getId)); int i = 0; for (HomeEntity homeEntity : homeList) { Location location = homeEntity.getHomeLocation(); @@ -53,11 +51,7 @@ public class HomeListGui extends PagingPage { player.closeInventory(); }); icons.add(icon); - if (i == beds.size() - 1) { - i = 0; - } else { - i++; - } + i++; } return icons; } diff --git a/Home/src/main/resources/plugin.yml b/Home/src/main/resources/plugin.yml index c2ec49d..fa86150 100644 --- a/Home/src/main/resources/plugin.yml +++ b/Home/src/main/resources/plugin.yml @@ -2,5 +2,5 @@ name: UltiTools-Home version: '${project.version}' main: com.ultikits.plugins.home.PluginMain base-package: com.ultikits.plugins.home -api-version: 605 +api-version: 603 authors: [ wisdomme ] diff --git a/MysqlConnector/pom.xml b/MysqlConnector/pom.xml index 0a98262..7c5d787 100644 --- a/MysqlConnector/pom.xml +++ b/MysqlConnector/pom.xml @@ -88,7 +88,7 @@ MysqlConnector MysqlConnector - 连接MySQL数据库的必须前置模块 + A MysqlConnector Plugin access_key.txt F:\SpigotServers\Servers\1.19.4\plugins\UltiTools\plugins diff --git a/Sidebar/pom.xml b/Sidebar/pom.xml index 45fe5b1..1afb493 100644 --- a/Sidebar/pom.xml +++ b/Sidebar/pom.xml @@ -6,7 +6,7 @@ com.ultikits.plugins Sidebar - 1.0.1 + 1.0.0 8 @@ -18,7 +18,7 @@ com.ultikits UltiTools-API - 6.0.5 + 6.0.0.202310142230 provided @@ -84,9 +84,9 @@ Sidebar UltiTools-Sidebar - 高性能支持变量的侧边栏显示 + Server Sidebar Display access_key.txt - F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins + F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/PlayerJoinListener.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/PlayerJoinListener.java index 8b62d81..8bd3820 100644 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/PlayerJoinListener.java +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/PlayerJoinListener.java @@ -1,36 +1,22 @@ package com.ultikits.plugins.sidebar; -import com.ultikits.ultitools.annotations.EventListener; import fr.mrmicky.fastboard.FastBoard; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; -import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; - -@EventListener public class PlayerJoinListener implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); FastBoard board = new FastBoard(player); - board.updateTitle(coloredMsg(SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle())); + board.updateTitle(ChatColor.translateAlternateColorCodes('&', SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle())); SidebarPlugin.getInstance().getBoards().put(player.getUniqueId(), board); } - @EventHandler - public void onPlayerKick(PlayerKickEvent event) { - Player player = event.getPlayer(); - FastBoard board = SidebarPlugin.getInstance().getBoards().remove(player.getUniqueId()); - if (board != null) { - board.delete(); - } - } - @EventHandler public void onQuit(PlayerQuitEvent e) { Player player = e.getPlayer(); diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SbCommand.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SbCommand.java deleted file mode 100644 index 8b23f17..0000000 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SbCommand.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.ultikits.plugins.sidebar; - -import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; -import com.ultikits.ultitools.annotations.command.*; -import fr.mrmicky.fastboard.FastBoard; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; - -@CmdExecutor(alias = {"sb"}) -@CmdTarget(CmdTarget.CmdTargetType.PLAYER) -public class SbCommand extends AbstractCommendExecutor { - - @CmdMapping(format = "close") - public void close(@CmdSender Player sender) { - SidebarPlugin.getInstance().getBoards().get(sender.getUniqueId()).delete(); - SidebarPlugin.getInstance().getBoards().remove(sender.getUniqueId()); - } - - @CmdMapping(format = "reload", requireOp = true) - public void reload() { - SidebarPlugin.getInstance().registerSelf(); - } - - @CmdMapping(format = "open") - public void open(@CmdSender Player player) { - FastBoard board = new FastBoard(player); - board.updateTitle(coloredMsg(SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle())); - SidebarPlugin.getInstance().getBoards().put(player.getUniqueId(), board); - } - - @Override - protected void handleHelp(CommandSender sender) { - - } -} diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarConfig.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarConfig.java index 5337602..82e17e4 100644 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarConfig.java +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarConfig.java @@ -1,7 +1,6 @@ package com.ultikits.plugins.sidebar; import com.ultikits.ultitools.abstracts.AbstractConfigEntity; -import com.ultikits.ultitools.annotations.ConfigEntity; import com.ultikits.ultitools.annotations.ConfigEntry; import lombok.Getter; import lombok.Setter; @@ -11,13 +10,12 @@ import java.util.List; @Getter @Setter -@ConfigEntity("config/config.yml") public class SidebarConfig extends AbstractConfigEntity { - @ConfigEntry(path = "scoreBoardTitle", comment = "侧边栏标题") + @ConfigEntry(path = "scoreBoardTitle", comment = "") private String title = "欢迎加入服务器"; - @ConfigEntry(path = "scoreBoardUpdateInterval", comment = "侧边栏更新间隔(单位:Tick)推荐20(每秒更新一次),最低1,更低会导致性能问题") + @ConfigEntry(path = "scoreBoardUpdateInterval", comment = "") private int updateInterval = 20; - @ConfigEntry(path = "sidebarContent", comment = "侧边栏内容(最多15行)") + @ConfigEntry(path = "sidebarContent", comment = "") private List content = new ArrayList<>(); public SidebarConfig(String configFilePath) { diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarPlugin.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarPlugin.java index 3fc759e..f0e795a 100644 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarPlugin.java +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarPlugin.java @@ -3,7 +3,6 @@ package com.ultikits.plugins.sidebar; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.abstracts.AbstractConfigEntity; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; -import com.ultikits.ultitools.annotations.UltiToolsModule; import fr.mrmicky.fastboard.FastBoard; import lombok.Getter; import me.clip.placeholderapi.PlaceholderAPI; @@ -13,25 +12,25 @@ import java.util.*; import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; -@UltiToolsModule public class SidebarPlugin extends UltiToolsPlugin { @Getter private static SidebarPlugin instance; @Getter private final Map boards = new HashMap<>(); - public SidebarPlugin(){ - super(); - instance = this; - } - @Override - public boolean registerSelf() { + public boolean registerSelf() throws IOException { + instance = this; + getListenerManager().register(this, new PlayerJoinListener()); int updateInterval = getConfig(SidebarConfig.class).getUpdateInterval(); new UpdateTask().runTaskTimerAsynchronously(UltiTools.getInstance(), 0, Math.max(updateInterval, 1)); return true; } + @Override + public void unregisterSelf() { + } + @Override public List supported() { return Arrays.asList("zh", "en"); @@ -43,4 +42,17 @@ public class SidebarPlugin extends UltiToolsPlugin { new SidebarConfig("config/config.yml") ); } + + protected void updateBoard(FastBoard board) { + List list = new ArrayList<>(); + for (String s : getConfig(SidebarConfig.class).getContent()) { + list.add(coloredMsg(PlaceholderAPI.setPlaceholders(board.getPlayer(), s))); + } + board.updateLines(list); + } + + @Override + public void reloadSelf() { + UltiToolsPlugin.getConfigManager().register(this, new SidebarConfig("config/config.yml")); + } } diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/UpdateTask.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/UpdateTask.java index 3ee9564..97bdf77 100644 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/UpdateTask.java +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/UpdateTask.java @@ -1,26 +1,16 @@ package com.ultikits.plugins.sidebar; import fr.mrmicky.fastboard.FastBoard; -import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.scheduler.BukkitRunnable; -import java.util.ArrayList; -import java.util.List; - -import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; - public class UpdateTask extends BukkitRunnable { @Override public void run() { for (FastBoard board : SidebarPlugin.getInstance().getBoards().values()) { - if (board.isDeleted() || !board.getPlayer().isOnline()){ + if (board.isDeleted()){ continue; } - List list = new ArrayList<>(); - for (String s : SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getContent()) { - list.add(coloredMsg(PlaceholderAPI.setPlaceholders(board.getPlayer(), s))); - } - board.updateLines(list); + SidebarPlugin.getInstance().updateBoard(board); } } } diff --git a/Sidebar/src/main/resources/plugin.yml b/Sidebar/src/main/resources/plugin.yml index 40dc9c0..fc2cbba 100644 --- a/Sidebar/src/main/resources/plugin.yml +++ b/Sidebar/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Sidebar version: '${project.version}' main: com.ultikits.plugins.sidebar.SidebarPlugin -api-version: 605 -authors: [ 'wisdomme' ] +api-version: 600 +authors: [ wisdomme ] diff --git a/UltiTools-API/pom.xml b/UltiTools-API/pom.xml index 5c1ac72..32c9f3f 100755 --- a/UltiTools-API/pom.xml +++ b/UltiTools-API/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> UltiTools-API com.ultikits - 6.0.5 + 6.0.4 4.0.0 UltiTools-API This project is the base of the Ultitools plugin development. @@ -36,8 +36,7 @@ 1.8 UTF-8 - 4.3.0 - 5.8.25 + 4.1.13 @@ -132,7 +131,6 @@ ${project.build.directory}/UltiTools/lib - provided @@ -205,18 +203,6 @@ true - - com.ultikits - ultitools-maven-plugin - 1.0.0 - - UltiTools-API - UltiTools-API - UltiTools-API - access_key.txt - F:\SpigotServers\Paper\1.20.4\plugins - - @@ -265,7 +251,7 @@ com.github.MilkBowl VaultAPI - 1.7.1 + 1.7 provided @@ -275,38 +261,8 @@ cn.hutool - hutool-core - ${hutool.version} - - - cn.hutool - hutool-crypto - ${hutool.version} - - - cn.hutool - hutool-db - ${hutool.version} - - - cn.hutool - hutool-json - ${hutool.version} - - - cn.hutool - hutool-cache - ${hutool.version} - - - cn.hutool - hutool-cron - ${hutool.version} - - - cn.hutool - hutool-http - ${hutool.version} + hutool-all + 5.8.20 mysql @@ -323,7 +279,7 @@ net.kyori adventure-platform-bukkit - 4.3.2 + 4.3.0 com.github.hamza-cskn @@ -335,12 +291,6 @@ spring-context 5.3.31 - - me.clip - placeholderapi - 2.11.4 - provided - diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/UltiTools.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/UltiTools.java index f41dc24..ef7bba4 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/UltiTools.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/UltiTools.java @@ -1,5 +1,6 @@ package com.ultikits.ultitools; +import com.ultikits.ultitools.context.ContextConfig; import com.ultikits.ultitools.commands.PluginInstallCommands; import com.ultikits.ultitools.commands.UltiToolsCommands; import com.ultikits.ultitools.context.ContextConfig; @@ -7,28 +8,20 @@ import com.ultikits.ultitools.entities.Language; import com.ultikits.ultitools.interfaces.DataStore; import com.ultikits.ultitools.interfaces.Localized; import com.ultikits.ultitools.interfaces.VersionWrapper; -import com.ultikits.ultitools.listeners.PlayerJoinListener; import com.ultikits.ultitools.manager.*; import com.ultikits.ultitools.tasks.DataStoreWaitingTask; -import com.ultikits.ultitools.utils.CommonUtils; -import com.ultikits.ultitools.utils.Metrics; import lombok.Getter; import lombok.Setter; import mc.obliviate.inventory.InventoryAPI; import net.kyori.adventure.platform.bukkit.BukkitAudiences; -import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.java.JavaPlugin; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.io.*; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLClassLoader; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -82,11 +75,7 @@ public final class UltiTools extends JavaPlugin implements Localized { * @return the version of the UltiTools */ public static int getPluginVersion() { - String versionString = getEnv().getString("version"); - if (versionString == null) { - throw new RuntimeException("Version not found in env.yml!"); - } - return Integer.parseInt(versionString.replace(".", "")); + return 604; } /** @@ -174,23 +163,10 @@ public final class UltiTools extends JavaPlugin implements Localized { String result = new BufferedReader(new InputStreamReader(in)).lines().collect(Collectors.joining("")); this.language = new Language(result); - // Plugin classloader initialization - pluginClassLoader = getClassLoader(); - URL serverJar = CommonUtils.getServerJar(); - try { - if (serverJar != null) { - String name = new File(serverJar.toURI()).getName().split("\\.jar")[0]; - Bukkit.getLogger().info("[UltiTools-API] Spigot API detected: " + name); - } - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - URLClassLoader classLoader = new URLClassLoader(new URL[]{serverJar}, pluginClassLoader); - // Spring context initialization pluginClassLoader = getClassLoader(); context = new AnnotationConfigApplicationContext(); - context.setClassLoader(classLoader); + context.setClassLoader(pluginClassLoader); context.register(ContextConfig.class); context.refresh(); context.registerShutdownHook(); @@ -208,11 +184,9 @@ public final class UltiTools extends JavaPlugin implements Localized { throw new RuntimeException(e); } - Metrics metrics = new Metrics(this, 8652); - // bukkit plugin registration - getCommandManager().register(context.getBean(UltiToolsCommands.class)); - getCommandManager().register(context.getBean(PluginInstallCommands.class)); + getCommandManager().register(new UltiToolsCommands()); + getCommandManager().register(new PluginInstallCommands()); Bukkit.getServicesManager().register( PluginManager.class, @@ -220,8 +194,6 @@ public final class UltiTools extends JavaPlugin implements Localized { this, ServicePriority.Normal ); - - Bukkit.getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); } /** @@ -242,7 +214,6 @@ public final class UltiTools extends JavaPlugin implements Localized { stopEmbedWebServer(); pluginManager.close(); context.close(); - getCommandManager().close(); DataStoreManager.close(); getConfigManager().saveAll(); Bukkit.getServicesManager().unregisterAll(this); @@ -304,20 +275,4 @@ public final class UltiTools extends JavaPlugin implements Localized { } return this.adventure; } - - /** - * Get the economy provider - * - * @return the instance of the Economy provider - */ - public Economy getEconomy() { - if (Bukkit.getPluginManager().getPlugin("Vault") == null) { - throw new RuntimeException("Vault not found!"); - } - RegisteredServiceProvider registration = Bukkit.getServicesManager().getRegistration(Economy.class); - if (registration == null) { - throw new RuntimeException("Economy service not found!"); - } - return registration.getProvider(); - } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/AbstractCommendExecutor.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/AbstractCommendExecutor.java index 84797d1..b09cefc 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/AbstractCommendExecutor.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/AbstractCommendExecutor.java @@ -4,10 +4,8 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.annotations.command.*; -import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -17,12 +15,10 @@ import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.*; -import java.util.function.Function; public abstract class AbstractCommendExecutor implements TabExecutor { private final BiMap mappings = HashBiMap.create(); @@ -30,11 +26,7 @@ public abstract class AbstractCommendExecutor implements TabExecutor { private final BiMap ServerLock = HashBiMap.create(); private final BiMap CmdCoolDown = HashBiMap.create(); - @Getter - private final Map>, Function> parsers = new HashMap<>(); - public AbstractCommendExecutor() { - initParsers(); scanCommandMappings(); } @@ -42,31 +34,6 @@ public abstract class AbstractCommendExecutor implements TabExecutor { return this; } - @SuppressWarnings("deprecation") - private void initParsers() { - parsers.put(Arrays.asList(Boolean[].class, Boolean.class, boolean[].class, boolean.class), Boolean::parseBoolean); - parsers.put(Arrays.asList(Double[].class, Double.class, double[].class, double.class), Double::parseDouble); - parsers.put(Arrays.asList(Integer[].class, Integer.class, int[].class, int.class), Integer::parseInt); - parsers.put(Arrays.asList(Float[].class, Float.class, float[].class, float.class), Float::parseFloat); - parsers.put(Arrays.asList(Short[].class, Short.class, short[].class, short.class), Short::parseShort); - parsers.put(Arrays.asList(Short[].class, Short.class, short[].class, short.class), Byte::parseByte); - parsers.put(Arrays.asList(OfflinePlayer[].class, OfflinePlayer.class), Bukkit::getOfflinePlayer); - parsers.put(Arrays.asList(Long[].class, Long.class, long[].class, long.class), Long::parseLong); - parsers.put(Arrays.asList(Material[].class, Material.class), Material::getMaterial); - parsers.put(Arrays.asList(Player[].class, Player.class), Bukkit::getPlayerExact); - parsers.put(Arrays.asList(UUID[].class, UUID.class), UUID::fromString); - parsers.put(Arrays.asList(String[].class, String.class), s -> s); - } - - private Function getParser(Class type) { - //noinspection unchecked - return (Function) parsers.keySet().stream() - .filter(classes -> classes.stream().anyMatch(clazz -> clazz.isAssignableFrom(type))) - .findFirst() - .map(parsers::get) - .orElse(null); - } - private void scanCommandMappings() { Class clazz = this.getClass(); Method[] methods = clazz.getDeclaredMethods(); @@ -77,71 +44,70 @@ public abstract class AbstractCommendExecutor implements TabExecutor { } } - private static Map getParams(String[] args, String format) { - if (args.length == 0) { - return Collections.emptyMap(); - } - + private Map getParams(String[] args, String format) { String[] formatArgs = format.split(" "); - Map params = new HashMap<>(); - List paramList = new ArrayList<>(); - int index = 0; - - for (String arg : args) { - String currentFormatArg = formatArgs[index]; - - if (currentFormatArg.startsWith("<") && currentFormatArg.endsWith("...>")) { - paramList.add(arg); - } else if (currentFormatArg.startsWith("<") && currentFormatArg.endsWith(">")) { - String paramName = currentFormatArg.substring(1, currentFormatArg.length() - 1); - params.put(paramName, new String[]{arg}); + Map params = new HashMap<>(); + for (int i = 0; i < formatArgs.length; i++) { + if (formatArgs[i].startsWith("<") && formatArgs[i].endsWith(">")) { + params.put(formatArgs[i].substring(1, formatArgs[i].length() - 1), args[i]); + } + if (formatArgs[i].startsWith("[") && formatArgs[i].endsWith("]")) { + params.put(formatArgs[i].substring(1, formatArgs[i].length() - 1), args[i]); } - - index = (index + 1) % formatArgs.length; - } - - if (!paramList.isEmpty()) { - params.put(formatArgs[index].substring(1, formatArgs[index].length() - 1), paramList.toArray(new String[0])); } - return params; } private Method matchMethod(String[] args) { - if (args.length == 0) { - return mappings.getOrDefault("", null); - } for (Map.Entry entry : mappings.entrySet()) { String format = entry.getKey(); + if (format.isEmpty() && args.length == 0) { + return entry.getValue(); + } String[] formatArgs = format.split(" "); - boolean match = true; - - for (int i = 0; i < formatArgs.length - 1; i++) { - if (!matchesArgument(formatArgs[i], args[i])) { - match = false; - break; + String lastArg = formatArgs[formatArgs.length - 1]; + boolean match; + if (lastArg.startsWith("[") && lastArg.endsWith("]")) { + if (formatArgs.length - args.length == 1) { + continue; + } + match = true; + for (int i = 0; i < formatArgs.length - 1; i++) { + String formatArg = formatArgs[i]; + String actualArg = args[i]; + if (formatArg.startsWith("<") && formatArg.endsWith(">")) { + continue; + } + if (!formatArg.equalsIgnoreCase(actualArg)) { + match = false; + break; + } + } + } else { + if (formatArgs.length != args.length) { + continue; + } + match = true; + for (int i = 0; i < formatArgs.length; i++) { + String formatArg = formatArgs[i]; + String actualArg = args[i]; + if (formatArg.startsWith("<") && formatArg.endsWith(">")) { + continue; + } + if (!formatArg.equalsIgnoreCase(actualArg)) { + match = false; + break; + } } } - if (match && matchesLastArgument(formatArgs[formatArgs.length - 1], args[formatArgs.length - 1])) { + if (match) { return entry.getValue(); } } return null; } - private boolean matchesArgument(String formatArg, String actualArg) { - return formatArg.startsWith("<") && formatArg.endsWith(">") || formatArg.equalsIgnoreCase(actualArg); - } - - private boolean matchesLastArgument(String formatArg, String actualArg) { - if (formatArg.endsWith("...>")) { - return true; - } - return matchesArgument(formatArg, actualArg); - } - - private boolean checkSender(CommandSender sender) { Class clazz = this.getClass(); if (!clazz.isAnnotationPresent(CmdTarget.class)) { @@ -177,23 +143,21 @@ public abstract class AbstractCommendExecutor implements TabExecutor { private boolean checkPermission(CommandSender sender) { Class clazz = this.getClass(); - if (!clazz.isAnnotationPresent(CmdExecutor.class)) { return true; } - CmdExecutor cmdExecutor = clazz.getAnnotation(CmdExecutor.class); + if (cmdExecutor.permission().isEmpty()) { + return true; + } String permission = cmdExecutor.permission(); - - if (permission.isEmpty() || sender.hasPermission(permission)) { + if (sender.hasPermission(permission)) { return true; } - sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("你没有权限执行这个指令!")); return false; } - private boolean checkPermission(CommandSender sender, Method method) { if (!method.isAnnotationPresent(CmdMapping.class)) { return true; @@ -274,60 +238,95 @@ public abstract class AbstractCommendExecutor implements TabExecutor { return false; } - private Object[] buildParams(String[] strings, Method method, CommandSender commandSender) { - Map params = getParams(strings, mappings.inverse().get(method)); + private Object[] parseParams(String[] strings, Method method, CommandSender commandSender) { + Map params = getParams(strings, mappings.inverse().get(method)); Parameter[] parameters = method.getParameters(); - if (parameters.length == 0) { return new Object[0]; } - - List paramList = new ArrayList<>(); - + List ParamList = new ArrayList<>(); for (Parameter parameter : parameters) { - Class paramType = parameter.getType(); - - if (paramType.equals(Player.class) || paramType.equals(CommandSender.class)) { - boolean isCmdSenderAnnotationPresent = parameter.isAnnotationPresent(CmdSender.class); - - if (paramType.equals(Player.class) && commandSender instanceof Player) { - paramList.add(isCmdSenderAnnotationPresent ? commandSender : null); - } else if (paramType.equals(CommandSender.class)) { - paramList.add(isCmdSenderAnnotationPresent ? commandSender : null); - } - + if (parameter.getType().equals(Player.class)) { + Player player = (Player) commandSender; + ParamList.add(parameter.isAnnotationPresent(CmdSender.class) ? player : null); + continue; + } + if (parameter.getType().equals(CommandSender.class)) { + ParamList.add(parameter.isAnnotationPresent(CmdSender.class) ? commandSender : null); continue; } - if (parameter.isAnnotationPresent(CmdParam.class)) { CmdParam cmdParam = parameter.getAnnotation(CmdParam.class); - String[] value = params.get(cmdParam.value()); + String value = params.get(cmdParam.value()); try { - paramList.add(parseType(value, paramType)); - } catch (Exception e) { - commandSender.sendMessage(ChatColor.RED + e.getMessage()); - //noinspection CallToPrintStackTrace - e.printStackTrace(); + if (parameter.getType() == float.class || parameter.getType() == Float.class) { + ParamList.add(Float.parseFloat(value)); + continue; + } + if (parameter.getType() == double.class || parameter.getType() == Double.class) { + ParamList.add(Double.parseDouble(value)); + continue; + } + if (parameter.getType() == int.class || parameter.getType() == Integer.class) { + ParamList.add(Integer.parseInt(value)); + continue; + } + } catch (NumberFormatException e) { + commandSender.sendMessage( + ChatColor.RED + String.format( + UltiTools.getInstance().i18n("参数 '%s' 格式错误:'%s' 不是一个有效的 %s 类型"), + cmdParam.value(), value, parameter.getType().getName() + )); return null; } + if (parameter.getType() == OfflinePlayer.class) { + ParamList.add(Bukkit.getOfflinePlayer(value)); + continue; + } + if (parameter.getType() == Player.class) { + Player player = Bukkit.getPlayerExact(value); + if (player == null) { + commandSender.sendMessage( + ChatColor.RED + String.format( + UltiTools.getInstance().i18n("玩家 \"%s\" 未找到"), + cmdParam.value(), value, parameter.getType().getName() + )); + return null; + } + ParamList.add(player); + } + ParamList.add(value); } else { - paramList.add(null); + ParamList.add(null); + } + if (parameter.isAnnotationPresent(OptionalParam.class)) { + if (parameter.getType() == Map.class) { + String format = method.getAnnotation(CmdMapping.class).format(); + String OptionParams = params.get(format.split(" ")[format.split(" ").length - 1]); + ParamList.add(parseOptionalParams(OptionParams)); + } else { + ParamList.add(null); + } } } - return paramList.toArray(); + return ParamList.toArray(); } - private Object parseType(String[] value, Class type) { - Function parser = getParser(type); - if (type.isArray()) { - Object array = Array.newInstance(type.getComponentType(), value.length); - for (int i = 0; i < value.length; i++) { - Array.set(array, i, parser.apply(value[i])); + private Map> parseOptionalParams(String OptionalParam) { + Map> resultMap = new HashMap<>(); + + String[] optionGroups = OptionalParam.split(";"); + for (String optionGroup : optionGroups) { + String[] parts = optionGroup.split("="); + if (parts.length == 2) { + String optionName = parts[0]; + String[] arguments = parts[1].split(","); + + resultMap.put(optionName, Arrays.asList(arguments)); } - return array; - } else { - return parser.apply(value[0]); } + + return resultMap; } private void setCoolDown(CommandSender commandSender, Method method) { @@ -415,23 +414,20 @@ public abstract class AbstractCommendExecutor implements TabExecutor { if (checkCD(commandSender)) { return true; } - Object[] params = buildParams(strings, method, commandSender); - if (params == null) { - return true; - } + Object[] params = parseParams(strings, method, commandSender); BukkitRunnable bukkitRunnable = new BukkitRunnable() { @Override public void run() { - UsageLimit usageLimit = method.getAnnotation(UsageLimit.class); - - if (usageLimit != null) { - if (usageLimit.value().equals(UsageLimit.LimitType.ALL)) { + if (method.isAnnotationPresent(UsageLimit.class)) { + if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.ALL)) { ServerLock.put(((Player) commandSender).getUniqueId(), method); - } else if (usageLimit.value().equals(UsageLimit.LimitType.SENDER) && commandSender instanceof Player) { - SenderLock.put(((Player) commandSender).getUniqueId(), method); + } + if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.SENDER)) { + if (commandSender instanceof Player) { + SenderLock.put(((Player) commandSender).getUniqueId(), method); + } } } - try { setCoolDown(commandSender, method); method.invoke(getInstance(), params); @@ -439,11 +435,14 @@ public abstract class AbstractCommendExecutor implements TabExecutor { sendErrorMessage(commandSender, command); throw new RuntimeException(e); } finally { - if (usageLimit != null) { - if (usageLimit.value().equals(UsageLimit.LimitType.ALL)) { + if (method.isAnnotationPresent(UsageLimit.class)) { + if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.ALL)) { ServerLock.remove(((Player) commandSender).getUniqueId()); - } else if (usageLimit.value().equals(UsageLimit.LimitType.SENDER) && commandSender instanceof Player) { - SenderLock.remove(((Player) commandSender).getUniqueId()); + } + if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.SENDER)) { + if (commandSender instanceof Player) { + SenderLock.remove(((Player) commandSender).getUniqueId()); + } } } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/UltiToolsPlugin.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/UltiToolsPlugin.java index fbdaec5..8f51e01 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/UltiToolsPlugin.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/UltiToolsPlugin.java @@ -1,6 +1,5 @@ package com.ultikits.ultitools.abstracts; -import cn.hutool.core.comparator.VersionComparator; import cn.hutool.core.io.FileUtil; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.annotations.EnableAutoRegister; @@ -16,7 +15,6 @@ import lombok.Setter; import lombok.SneakyThrows; import org.bukkit.configuration.file.YamlConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.core.annotation.AnnotationUtils; import java.io.*; import java.net.JarURLConnection; @@ -56,16 +54,16 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl private AnnotationConfigApplicationContext context; @SneakyThrows - public UltiToolsPlugin() { - InputStream inputStream = getInputStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + public UltiToolsPlugin(){ + InputStream inputStream = getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); YamlConfiguration pluginConfig = YamlConfiguration.loadConfiguration(reader); - version = pluginConfig.getString("version"); - pluginName = pluginConfig.getString("name"); - authors = pluginConfig.getStringList("authors"); - loadAfter = pluginConfig.getStringList("loadAfter"); - minUltiToolsVersion = pluginConfig.getInt("api-version"); - mainClass = pluginConfig.getString("main"); + version = pluginConfig.getString("version"); + pluginName = pluginConfig.getString("name"); + authors = pluginConfig.getStringList("authors"); + loadAfter = pluginConfig.getStringList("loadAfter"); + minUltiToolsVersion = pluginConfig.getInt("api-version"); + mainClass = pluginConfig.getString("mainClass"); inputStream.close(); reader.close(); @@ -101,7 +99,7 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl String result = new BufferedReader(new InputStreamReader(in)) .lines().collect(Collectors.joining("")); language = new Language(result); - } else { + }else { language = new Language("{}"); } } else { @@ -111,28 +109,8 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl initConfig(); } - public static ConfigManager getConfigManager() { - return UltiTools.getInstance().getConfigManager(); - } - - public static ListenerManager getListenerManager() { - return UltiTools.getInstance().getListenerManager(); - } - - public static CommandManager getCommandManager() { - return UltiTools.getInstance().getCommandManager(); - } - - public static PluginManager getPluginManager() { - return UltiTools.getInstance().getPluginManager(); - } - - public static VersionWrapper getVersionWrapper() { - return UltiTools.getInstance().getVersionWrapper(); - } - public final void initConfig() { - EnableAutoRegister annotation = AnnotationUtils.findAnnotation(this.getClass(), EnableAutoRegister.class); + EnableAutoRegister annotation = this.getClass().getAnnotation(EnableAutoRegister.class); if (annotation != null && annotation.config()) { for (String packageName : CommonUtils.getPluginPackages(this)) { UltiTools.getInstance().getConfigManager().registerAll( @@ -148,14 +126,34 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl } private InputStream getInputStream() throws IOException { - CodeSource src = this.getClass().getProtectionDomain().getCodeSource(); - URL jar = src.getLocation(); - String path = jar.getPath().startsWith("/") ? jar.getPath() : jar.getPath().substring(1); - URL url = new URL("jar:file:" + path + "!/plugin.yml"); + CodeSource src = this.getClass().getProtectionDomain().getCodeSource(); + URL jar = src.getLocation(); + String path = jar.getPath().startsWith("/") ? jar.getPath() : jar.getPath().substring(1); + URL url = new URL("jar:file:" + path + "!/plugin.yml"); JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); return jarConnection.getInputStream(); } + public static ConfigManager getConfigManager() { + return UltiTools.getInstance().getConfigManager(); + } + + public static ListenerManager getListenerManager() { + return UltiTools.getInstance().getListenerManager(); + } + + public static CommandManager getCommandManager() { + return UltiTools.getInstance().getCommandManager(); + } + + public static PluginManager getPluginManager() { + return UltiTools.getInstance().getPluginManager(); + } + + public static VersionWrapper getVersionWrapper() { + return UltiTools.getInstance().getVersionWrapper(); + } + protected final String getConfigFolder() { return UltiTools.getInstance().getDataFolder().getAbsolutePath() + "/pluginConfig/" + this.getPluginName(); } @@ -242,19 +240,4 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl public final String i18n(String code, String str) { return this.getLanguage().getLocalizedText(str); } - - public boolean isNewerVersionThan(UltiToolsPlugin plugin) { - return VersionComparator.INSTANCE.compare(this.getVersion(), plugin.getVersion()) > 0; - } - - @Override - public void unregisterSelf() { - getCommandManager().unregisterAll(this); - getListenerManager().unregisterAll(this); - } - - @Override - public void reloadSelf() { - getConfigManager().reloadConfigs(this); - } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/OkCancelPage.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/OkCancelPage.java index c4b92c9..6146459 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/OkCancelPage.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/OkCancelPage.java @@ -5,14 +5,13 @@ import com.ultikits.ultitools.entities.Colors; import mc.obliviate.inventory.Gui; import mc.obliviate.inventory.Icon; import net.kyori.adventure.text.Component; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryType; import org.jetbrains.annotations.NotNull; -import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; - public abstract class OkCancelPage extends Gui { public OkCancelPage(@NotNull Player player, @NotNull String id, String title, int rows) { super(player, id, title, rows); @@ -36,13 +35,13 @@ public abstract class OkCancelPage extends Gui { lastRowBackground.setName(" "); this.fillRow(lastRowBackground, getSize() / 9 - 1); Icon ok = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN)); - ok.setName(coloredMsg(UltiTools.getInstance().i18n("OK"))); + ok.setName(ChatColor.translateAlternateColorCodes('&', UltiTools.getInstance().i18n("OK"))); ok.onClick((e) -> { onOk(e); player.closeInventory(); }); Icon cancel = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.RED)); - cancel.setName(coloredMsg(UltiTools.getInstance().i18n("取消"))); + cancel.setName(ChatColor.translateAlternateColorCodes('&', UltiTools.getInstance().i18n("取消"))); cancel.onClick((e) -> { onCancel(e); player.closeInventory(); diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/PagingPage.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/PagingPage.java index f4dfc00..b9522f1 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/PagingPage.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/PagingPage.java @@ -45,17 +45,9 @@ public abstract class PagingPage extends Gui { @Override public void onOpen(InventoryOpenEvent event) { - updateItems(); - } - - public void updateItems() { - paginationManager.getItems().clear(); Icon lastRowBackground = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GRAY)); lastRowBackground.setName(" "); this.fillRow(lastRowBackground, getSize() / 9 - 1); - for (Icon icon : setAllItems()) { - paginationManager.addItem(icon); - } Icon next = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN)); next.setName(info(UltiTools.getInstance().i18n("下一页"))); if (this.paginationManager.isLastPage()) { @@ -66,7 +58,6 @@ public abstract class PagingPage extends Gui { return; } this.paginationManager.goNextPage(); - updateItems(); }); Icon last = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN)); last.setName(info(UltiTools.getInstance().i18n("上一页"))); @@ -78,10 +69,17 @@ public abstract class PagingPage extends Gui { return; } this.paginationManager.goPreviousPage(); - updateItems(); }); this.addItem(getLastSlot() - 3, next); this.addItem(getLastSlot() - 5, last); + updateItems(); + } + + public void updateItems() { + paginationManager.getItems().clear(); + for (Icon icon : setAllItems()) { + paginationManager.addItem(icon); + } paginationManager.update(); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EnableAutoRegister.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EnableAutoRegister.java index c107ad3..810fb05 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EnableAutoRegister.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EnableAutoRegister.java @@ -1,10 +1,12 @@ package com.ultikits.ultitools.annotations; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -@Documented public @interface EnableAutoRegister { String scanPackage() default ""; boolean eventListener() default true; diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java index f030a2e..9d44ac4 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java @@ -1,13 +1,11 @@ package com.ultikits.ultitools.annotations; -import org.springframework.stereotype.Component; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; -import java.lang.annotation.*; - -@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -@Component public @interface EventListener { - boolean manualRegister() default false; } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/I18n.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/I18n.java index 0057423..2b37e99 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/I18n.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/I18n.java @@ -1,10 +1,12 @@ package com.ultikits.ultitools.annotations; -import java.lang.annotation.*; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -@Documented public @interface I18n { - String[] value() default {}; + String[] value(); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/UltiToolsModule.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/UltiToolsModule.java deleted file mode 100644 index d0afe77..0000000 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/UltiToolsModule.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.ultikits.ultitools.annotations; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.annotation.AliasFor; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -@EnableAutoRegister -@I18n -@ComponentScan -@Configuration -public @interface UltiToolsModule { - @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") - String[] scanBasePackages() default {}; - - @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") - Class[] scanBasePackageClasses() default {}; - - @AliasFor(annotation = EnableAutoRegister.class, attribute = "eventListener") - boolean eventListener() default true; - - @AliasFor(annotation = EnableAutoRegister.class, attribute = "cmdExecutor") - boolean cmdExecutor() default true; - - @AliasFor(annotation = EnableAutoRegister.class, attribute = "config") - boolean config() default true; - - @AliasFor(annotation = I18n.class, attribute = "value") - String[] i18n() default {}; -} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java index e83729d..e36b4e2 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java @@ -1,7 +1,5 @@ package com.ultikits.ultitools.annotations.command; -import org.springframework.stereotype.Component; - import java.lang.annotation.*; /** @@ -13,7 +11,6 @@ import java.lang.annotation.*; @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) -@Component public @interface CmdExecutor { /** @@ -35,9 +32,4 @@ public @interface CmdExecutor { * @return 是否要求OP */ boolean requireOp() default false; - - /** - * @return 是否手动注册 - */ - boolean manualRegister() default false; } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/PluginInstallCommands.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/PluginInstallCommands.java index 0f5c94c..34bb7cd 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/PluginInstallCommands.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/PluginInstallCommands.java @@ -121,7 +121,7 @@ public class PluginInstallCommands extends AbstractCommendExecutor { @CmdMapping(format = "install ") public void installPlugin(@CmdSender CommandSender sender, @CmdParam("plugin") String plugin, @CmdParam("version") String version) { if (PluginInstallUtils.installPlugin(plugin, version)) { - sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!请务必删除旧版本模块!")); + sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!")); } else { sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("安装失败!")); } @@ -130,7 +130,7 @@ public class PluginInstallCommands extends AbstractCommendExecutor { @CmdMapping(format = "install ") public void installPlugin(@CmdSender CommandSender sender, @CmdParam("plugin") String plugin) { if (PluginInstallUtils.installLatestPlugin(plugin)) { - sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!请务必删除旧版本模块!")); + sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!")); } else { sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("安装失败!")); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/UltiToolsCommands.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/UltiToolsCommands.java index 6afb1cc..bc188db 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/UltiToolsCommands.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/UltiToolsCommands.java @@ -3,7 +3,10 @@ package com.ultikits.ultitools.commands; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; -import com.ultikits.ultitools.annotations.command.*; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; import org.bukkit.command.CommandSender; import java.io.IOException; diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/entities/common/WorldLocation.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/entities/common/WorldLocation.java index 377dcbb..523b33a 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/entities/common/WorldLocation.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/entities/common/WorldLocation.java @@ -2,7 +2,6 @@ package com.ultikits.ultitools.entities.common; import lombok.Data; import lombok.NoArgsConstructor; -import org.bukkit.Bukkit; import org.bukkit.Location; import java.io.Serializable; @@ -35,10 +34,6 @@ public class WorldLocation implements Serializable { this.pitch = pitch; } - public Location toLocation() { - return new Location(Bukkit.getWorld(world), x, y, z, yaw, pitch); - } - @Override public String toString() { return "{" diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/IPlugin.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/IPlugin.java index 99eed20..61f3377 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/IPlugin.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/IPlugin.java @@ -24,5 +24,6 @@ public interface IPlugin { /** * 重载此插件模块时调用的方法,此重载并非重启模块,不会调用{@link #registerSelf()}和{@link #unregisterSelf()}。 */ - void reloadSelf(); + default void reloadSelf() { + } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/Localized.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/Localized.java index 9759d29..5da46fd 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/Localized.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/Localized.java @@ -1,7 +1,6 @@ package com.ultikits.ultitools.interfaces; import com.ultikits.ultitools.annotations.I18n; -import org.springframework.core.annotation.AnnotationUtils; import java.util.ArrayList; import java.util.Arrays; @@ -20,8 +19,9 @@ public interface Localized { * @return 支持的语言代码 Supported language codes */ default List supported() { - I18n i18n = AnnotationUtils.findAnnotation(this.getClass(), I18n.class); - if (i18n != null) { + Class clazz = this.getClass(); + if (clazz.isAnnotationPresent(I18n.class)) { + I18n i18n = clazz.getAnnotation(I18n.class); return Arrays.asList(i18n.value()); } else { return new ArrayList<>(); diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempEventHandler.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempEventHandler.java deleted file mode 100644 index 192f124..0000000 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempEventHandler.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.ultikits.ultitools.interfaces; - -import org.bukkit.entity.Player; -import org.bukkit.event.Event; - -public interface TempEventHandler { - boolean handle(E event); -} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempListener.java deleted file mode 100644 index bbebd9b..0000000 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempListener.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ultikits.ultitools.interfaces; - -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; - -public interface TempListener extends Listener { - void register(); - - default void unregister() { - HandlerList.unregisterAll(this); - } -} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/PlayerTempListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/PlayerTempListener.java deleted file mode 100644 index e05f719..0000000 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/PlayerTempListener.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.ultikits.ultitools.interfaces.impl; - -import com.ultikits.ultitools.UltiTools; -import com.ultikits.ultitools.interfaces.TempEventHandler; -import com.ultikits.ultitools.interfaces.TempListener; -import lombok.*; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventPriority; -import org.bukkit.event.player.PlayerEvent; - -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Setter -@Getter -public class PlayerTempListener implements TempListener { - private Class eventClass; - private EventPriority priority = EventPriority.NORMAL; - private TempEventHandler eventHandler; - private Player player; - - public PlayerTempListener(Class eventClass, TempEventHandler eventHandler) { - this.eventClass = eventClass; - this.eventHandler = eventHandler; - } - - public PlayerTempListener(Class eventClass, TempEventHandler eventHandler, Player player) { - this.eventClass = eventClass; - this.eventHandler = eventHandler; - this.player = player; - } - - @SuppressWarnings("unchecked") - public void register() { - Bukkit.getServer().getPluginManager().registerEvent(eventClass, this, priority, - (ignored, event) -> { - try { - if (player == null) { - if (eventHandler.handle((E) event)) { - unregister(); - } - } else if (((E) event).getPlayer().equals(player)) { - if (eventHandler.handle((E) event)) { - unregister(); - } - } - } catch (ClassCastException e) { - throw new RuntimeException(e); - } - }, - UltiTools.getInstance() - ); - } -} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleJsonDataOperator.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleJsonDataOperator.java index 54862db..1a7ed88 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleJsonDataOperator.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleJsonDataOperator.java @@ -61,7 +61,7 @@ public class SimpleJsonDataOperator implements Dat @Override public boolean exist(WhereCondition... whereConditions) { - return !getAll(whereConditions).isEmpty(); + return getAll(whereConditions).size() > 0; } @Override diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleTempListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleTempListener.java deleted file mode 100644 index 6a536f7..0000000 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleTempListener.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.ultikits.ultitools.interfaces.impl; - -import com.ultikits.ultitools.UltiTools; -import com.ultikits.ultitools.interfaces.TempEventHandler; -import com.ultikits.ultitools.interfaces.TempListener; -import lombok.*; -import org.bukkit.Bukkit; -import org.bukkit.event.Event; -import org.bukkit.event.EventPriority; - -@Builder -@AllArgsConstructor -@NoArgsConstructor -@Setter -@Getter -public class SimpleTempListener implements TempListener { - private Class eventClass; - private EventPriority priority = EventPriority.NORMAL; - private TempEventHandler eventHandler; - - public SimpleTempListener(Class eventClass, TempEventHandler eventHandler) { - this.eventClass = eventClass; - this.eventHandler = eventHandler; - } - - public void register() { - Bukkit.getServer().getPluginManager().registerEvent(eventClass, this, priority, - (ignored, event) -> { - try { - //noinspection unchecked - if (eventHandler.handle((E) event)){ - unregister(); - } - } catch (ClassCastException e) { - throw new RuntimeException(e); - } - }, - UltiTools.getInstance() - ); - } -} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/listeners/PlayerJoinListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/listeners/PlayerJoinListener.java deleted file mode 100644 index 30e0592..0000000 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/listeners/PlayerJoinListener.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.ultikits.ultitools.listeners; - -import com.ultikits.ultitools.UltiTools; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.Arrays; -import java.util.List; - -public class PlayerJoinListener implements Listener { - private final List placeholderList = Arrays.asList("player", "server", "math", "vault", "localtime"); - - // make the word first letter uppercase - public static String toUpperCaseFirstOne(String s) { - if (Character.isUpperCase(s.charAt(0))) - return s; - else - return Character.toUpperCase(s.charAt(0)) + s.substring(1); - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - try { - boolean reload = false; - long time = 30L; - for (String placeholder : placeholderList) { - if (!PlaceholderAPI.isRegistered(placeholder)) { - reload = true; - new BukkitRunnable() { - @Override - public void run() { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "papi ecloud download " + toUpperCaseFirstOne(placeholder)); - } - }.runTaskLater(UltiTools.getInstance(), time); - time += 30L; - } - } - if (reload) { - new BukkitRunnable() { - @Override - public void run() { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "papi reload"); - } - }.runTaskLater(UltiTools.getInstance(), time + 30L); - } - } catch (Exception ignored) { - - } - } -} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java index d3775f1..cf9824a 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java @@ -6,7 +6,6 @@ import com.ultikits.ultitools.abstracts.UltiToolsPlugin; import com.ultikits.ultitools.annotations.command.CmdExecutor; import com.ultikits.ultitools.utils.PackageScanUtils; import org.bukkit.Bukkit; -import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandMap; import org.bukkit.command.PluginCommand; @@ -16,75 +15,32 @@ import org.bukkit.plugin.SimplePluginManager; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import java.util.*; +import java.util.Arrays; +import java.util.Objects; +import java.util.Set; public class CommandManager { - private final Map> commandListMap = new HashMap<>(); - - /** - * 手动注册一个命令。仅用于注册被@CmdExecutor注解的类。会自动注入依赖。 - * - * @param plugin 插件实例 - * @param clazz 命令执行器类 - * @param permission 权限 - * @param description 描述 - * @param aliases 别名 - */ - public void register(UltiToolsPlugin plugin, Class clazz, String permission, String description, String... aliases) { - CommandExecutor commandExecutor = UltiTools.getInstance().getContext().getBean(clazz); - register(plugin, commandExecutor, permission, description, aliases); - } - /** - * 手动注册一个命令,不会被容器管理。不会自动注入依赖。 - * - * @param plugin 插件实例 - * @param commandExecutor 命令执行器实例 - * @param permission 权限 - * @param description 描述 - * @param aliases 别名 - */ - private void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor, String permission, String description, String... aliases) { - register(commandExecutor, permission, plugin.i18n(description), aliases); + public void register(CommandExecutor commandExecutor, String permission, String description, String... aliases) { PluginCommand command = getCommand(aliases[0], UltiTools.getInstance()); - commandListMap.computeIfAbsent(plugin, k -> new ArrayList<>()); - List commands = commandListMap.get(plugin); - if (!commands.contains(command)) { - commands.add(command); - } - } - /** - * 手动注册一个命令。仅用于注册被@CmdExecutor注解的类。会自动注入依赖。 - * - * @param plugin 插件实例 - * @param clazz 命令执行器类 - */ - public void register(UltiToolsPlugin plugin, Class clazz) { - CommandExecutor commandExecutor = plugin.getContext().getBean(clazz); - register(plugin, commandExecutor); + command.setAliases(Arrays.asList(aliases)); + command.setPermission(permission); + command.setDescription(description); + getCommandMap().register(UltiTools.getInstance().getDescription().getName(), command); + command.setExecutor(commandExecutor); } - /** - * 手动注册一个命令,不会被容器管理。不会自动注入依赖。 - * - * @param plugin 插件实例 - * @param commandExecutor 命令执行器实例 - */ - private void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor) { - Class clazz = commandExecutor.getClass(); - - if (clazz.isAnnotationPresent(CmdExecutor.class)) { - CmdExecutor cmdExecutor = clazz.getAnnotation(CmdExecutor.class); - register(commandExecutor, cmdExecutor.permission(), plugin.i18n(cmdExecutor.description()), cmdExecutor.alias()); - return; - } else { - Bukkit.getLogger().warning("CommandExecutor " + clazz.getName() + " is not annotated with @CmdExecutor, please use legacy method to register command."); - } + public void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor) { plugin.getContext().getAutowireCapableBeanFactory().autowireBean(commandExecutor); register(commandExecutor); } + public void unregister(String name) { + PluginCommand command = getCommand(name, UltiTools.getInstance()); + command.unregister(getCommandMap()); + } + public void registerAll(UltiToolsPlugin plugin, String packageName) { Set> classes = PackageScanUtils.scanAnnotatedClasses( CmdExecutor.class, @@ -104,44 +60,6 @@ public class CommandManager { } } - public void registerAll(UltiToolsPlugin plugin) { - for (String cmdBean : plugin.getContext().getBeanNamesForType(CommandExecutor.class)) { - CommandExecutor commandExecutor = plugin.getContext().getBean(cmdBean, CommandExecutor.class); - if (commandExecutor.getClass().getAnnotation(CmdExecutor.class).manualRegister()) continue; - register(plugin, commandExecutor); - } - } - - public void unregister(String name) { - PluginCommand command = getCommand(name, UltiTools.getInstance()); - command.unregister(getCommandMap()); - } - - public void unregisterAll(UltiToolsPlugin plugin) { - List commands = commandListMap.get(plugin); - if (commands == null) return; - for (Command command : commands) { - unregister(command.getName()); - } - } - - public void close() { - for (UltiToolsPlugin plugin : commandListMap.keySet()) { - unregisterAll(plugin); - } - } - - @Deprecated - public void register(CommandExecutor commandExecutor, String permission, String description, String... aliases) { - PluginCommand command = getCommand(aliases[0], UltiTools.getInstance()); - command.setAliases(Arrays.asList(aliases)); - command.setPermission(permission); - command.setDescription(description); - getCommandMap().register(UltiTools.getInstance().getDescription().getName(), command); - command.setExecutor(commandExecutor); - } - - @Deprecated public void register(CommandExecutor commandExecutor) { Class clazz = commandExecutor.getClass(); diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/DataStoreManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/DataStoreManager.java index eeb5366..46a14f0 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/DataStoreManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/DataStoreManager.java @@ -23,7 +23,7 @@ public class DataStoreManager { } public static void close() { - Bukkit.getLogger().log(Level.INFO, "[UltiTools-API] Unregistering all data operators..."); + Bukkit.getLogger().log(Level.INFO, "Unregistering all data operators..."); for (DataStore dataStore : dataMap.values()) { dataStore.destroyAllOperators(); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java index 19d4b0b..5f2200b 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java @@ -14,12 +14,6 @@ import java.util.*; public class ListenerManager { private final Map> listenerListMap = new HashMap<>(); - public void register(UltiToolsPlugin plugin, Class listenerClass) { - Listener listener = plugin.getContext().getBean(listenerClass); - register(plugin, listener); - } - - @Deprecated public void register(UltiToolsPlugin plugin, Listener listener) { listenerListMap.computeIfAbsent(plugin, k -> new ArrayList<>()); Bukkit.getServer().getPluginManager().registerEvents(listener, UltiTools.getInstance()); @@ -48,14 +42,6 @@ public class ListenerManager { } } - public void registerAll(UltiToolsPlugin plugin) { - for (String listenerBean : plugin.getContext().getBeanNamesForType(Listener.class)) { - Listener listener = plugin.getContext().getBean(listenerBean, Listener.class); - if (listener.getClass().getAnnotation(EventListener.class).manualRegister()) continue; - register(plugin, listener); - } - } - public void unregister(Listener listener) { HandlerList.unregisterAll(listener); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java index 98e0952..1e53725 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java @@ -9,15 +9,11 @@ import com.ultikits.ultitools.utils.CommonUtils; import lombok.Getter; import org.bukkit.Bukkit; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.core.annotation.AnnotationUtils; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.net.URLDecoder; +import java.net.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -33,7 +29,7 @@ public class PluginManager { public void init() throws IOException { String currentPath = System.getProperty("user.dir"); - String path = currentPath + File.separator + "plugins" + File.separator + "UltiTools" + File.separator + "plugins"; + String path = currentPath+ File.separator + "plugins" + File.separator + "UltiTools" + File.separator + "plugins"; File pluginFolder = new File(path); File[] plugins = pluginFolder.listFiles((file) -> file.getName().endsWith(".jar")); @@ -84,7 +80,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin, true); + registerBukkit(plugin); } return result; } @@ -112,7 +108,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin, false); + registerBukkit(plugin); } return result; } @@ -142,7 +138,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin, false); + registerBukkit(plugin); } return result; } @@ -178,10 +174,7 @@ public class PluginManager { try { @SuppressWarnings("resource") URLClassLoader classLoader = new URLClassLoader( - new URL[]{ - new URL(URLDecoder.decode(pluginJar.toURI().toASCIIString(), "UTF-8")), - CommonUtils.getServerJar() - }, + new URL[]{new URL(URLDecoder.decode(pluginJar.toURI().toASCIIString(), "UTF-8"))}, UltiTools.getInstance().getPluginClassLoader() ); try (JarFile jarFile = new JarFile(pluginJar)) { @@ -218,21 +211,6 @@ public class PluginManager { private boolean invokeRegisterSelf(UltiToolsPlugin plugin) { - for (UltiToolsPlugin plugin1 : pluginList) { - if (!plugin1.getMainClass().equals(plugin.getMainClass())) { - continue; - } - if (plugin1.isNewerVersionThan(plugin)) { - Bukkit.getLogger().log( - Level.WARNING, - String.format("[UltiTools-API] %s load failed!There is already a new version!", plugin.getPluginName()) - ); - plugin.getContext().close(); - return false; - } else if (plugin.isNewerVersionThan(plugin1)) { - plugin1.unregisterSelf(); - } - } if (plugin.getMinUltiToolsVersion() > UltiTools.getPluginVersion()) { Bukkit.getLogger().log( Level.WARNING, @@ -243,6 +221,7 @@ public class PluginManager { } try { boolean registerSelf = plugin.registerSelf(); + registerBukkit(plugin); if (registerSelf) { pluginList.add(plugin); Bukkit.getLogger().log( @@ -265,14 +244,10 @@ public class PluginManager { } private UltiToolsPlugin initializePlugin(Class pluginClass, Object... constructorArgs) { - URLClassLoader urlClassLoader = new URLClassLoader( - new URL[]{CommonUtils.getServerJar()}, - pluginClass.getClassLoader() - ); AnnotationConfigApplicationContext pluginContext = new AnnotationConfigApplicationContext(); pluginContext.setParent(UltiTools.getInstance().getContext()); pluginContext.registerShutdownHook(); - pluginContext.setClassLoader(urlClassLoader); + pluginContext.setClassLoader(pluginClass.getClassLoader()); pluginContext.registerBean(pluginClass, constructorArgs); pluginContext.refresh(); UltiToolsPlugin plugin = pluginContext.getBean(pluginClass); @@ -282,26 +257,18 @@ public class PluginManager { return plugin; } - private void registerBukkit(UltiToolsPlugin plugin, boolean flag) { - EnableAutoRegister annotation = AnnotationUtils.findAnnotation(plugin.getClass(), EnableAutoRegister.class); - if (annotation == null) { + private void registerBukkit(UltiToolsPlugin plugin) { + if (!plugin.getClass().isAnnotationPresent(EnableAutoRegister.class)) { return; } + EnableAutoRegister annotation = plugin.getClass().getAnnotation(EnableAutoRegister.class); String[] packages = CommonUtils.getPluginPackages(plugin); for (String packageName : packages) { if (annotation.cmdExecutor()) { - if (flag) { - UltiTools.getInstance().getCommandManager().registerAll(plugin); - } else { - UltiTools.getInstance().getCommandManager().registerAll(plugin, packageName); - } + UltiTools.getInstance().getCommandManager().registerAll(plugin, packageName); } if (annotation.eventListener()) { - if (flag) { - UltiTools.getInstance().getListenerManager().registerAll(plugin); - } else { - UltiTools.getInstance().getListenerManager().registerAll(plugin, packageName); - } + UltiTools.getInstance().getListenerManager().registerAll(plugin, packageName); } } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/CommonUtils.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/CommonUtils.java index 199e48e..68c6685 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/CommonUtils.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/CommonUtils.java @@ -6,16 +6,12 @@ import cn.hutool.json.JSONUtil; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; import com.ultikits.ultitools.annotations.EnableAutoRegister; -import org.bukkit.Bukkit; import org.springframework.context.annotation.ComponentScan; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.net.URL; import java.nio.charset.StandardCharsets; -import java.security.CodeSource; -import java.security.ProtectionDomain; public class CommonUtils { @@ -58,12 +54,4 @@ public class CommonUtils { return packages; } - public static URL getServerJar() { - ProtectionDomain protectionDomain = Bukkit.class.getProtectionDomain(); - CodeSource codeSource = protectionDomain.getCodeSource(); - if (codeSource == null) { - return null; - } - return codeSource.getLocation(); - } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/Metrics.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/Metrics.java deleted file mode 100644 index f26f011..0000000 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/Metrics.java +++ /dev/null @@ -1,713 +0,0 @@ -package com.ultikits.ultitools.utils; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonPrimitive; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; -import org.bukkit.plugin.RegisteredServiceProvider; -import org.bukkit.plugin.ServicePriority; - -import javax.net.ssl.HttpsURLConnection; -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.concurrent.Callable; -import java.util.logging.Level; -import java.util.zip.GZIPOutputStream; - -/** - * bStats collects some data for plugin authors. - *

- * Check out https://bStats.org/ to learn more about bStats! - */ -@SuppressWarnings({"WeakerAccess", "unused"}) -public class Metrics { - - // The version of this bStats class - public static final int B_STATS_VERSION = 1; - // The url to which the data is sent - private static final String URL = "https://bStats.org/submitData/bukkit"; - // Should failed requests be logged? - private static boolean logFailedRequests; - // Should the sent data be logged? - private static boolean logSentData; - // Should the response text be logged? - private static boolean logResponseStatusText; - // The uuid of the server - private static String serverUUID; - - static { - // You can use the property to disable the check in your test environment - if (System.getProperty("bstats.relocatecheck") == null || !System.getProperty("bstats.relocatecheck").equals("false")) { - // Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D - final String defaultPackage = new String( - new byte[]{'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u', 'k', 'k', 'i', 't'}); - final String examplePackage = new String(new byte[]{'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); - } - } - - // The plugin - private final Plugin plugin; - // The plugin id - private final int pluginId; - // A list with all custom charts - private final List charts = new ArrayList<>(); - // Is bStats enabled on this server? - private boolean enabled; - - /** - * Class constructor. - * - * @param plugin The plugin which stats should be submitted. - * @param pluginId The id of the plugin. - * It can be found at What is my plugin id? - */ - public Metrics(Plugin plugin, int pluginId) { - if (plugin == null) { - throw new IllegalArgumentException("Plugin cannot be null!"); - } - this.plugin = plugin; - this.pluginId = pluginId; - - // Get the config file - File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); - File configFile = new File(bStatsFolder, "config.yml"); - YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); - - // Check if the config file exists - if (!config.isSet("serverUuid")) { - - // Add default values - config.addDefault("enabled", true); - // Every server gets it's unique random id. - config.addDefault("serverUuid", UUID.randomUUID().toString()); - // Should failed request be logged? - config.addDefault("logFailedRequests", false); - // Should the sent data be logged? - config.addDefault("logSentData", false); - // Should the response text be logged? - config.addDefault("logResponseStatusText", false); - - // Inform the server owners about bStats - config.options().header( - "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + - "To honor their work, you should not disable it.\n" + - "This has nearly no effect on the server performance!\n" + - "Check out https://bStats.org/ to learn more :)" - ).copyDefaults(true); - try { - config.save(configFile); - } catch (IOException ignored) { - } - } - - // Load the data - enabled = config.getBoolean("enabled", true); - serverUUID = config.getString("serverUuid"); - logFailedRequests = config.getBoolean("logFailedRequests", false); - logSentData = config.getBoolean("logSentData", false); - logResponseStatusText = config.getBoolean("logResponseStatusText", false); - - if (enabled) { - boolean found = false; - // Search for all other bStats Metrics classes to see if we are the first one - for (Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - found = true; // We aren't the first - break; - } catch (NoSuchFieldException ignored) { - } - } - // Register our service - Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal); - if (!found) { - // We are the first! - startSubmitting(); - } - } - } - - /** - * Sends the data to the bStats server. - * - * @param plugin Any plugin. It's just used to get a logger instance. - * @param data The data to send. - * @throws Exception If the request failed. - */ - private static void sendData(Plugin plugin, JsonObject data) throws Exception { - if (data == null) { - throw new IllegalArgumentException("Data cannot be null!"); - } - if (Bukkit.isPrimaryThread()) { - throw new IllegalAccessException("This method must not be called from the main thread!"); - } - if (logSentData) { - plugin.getLogger().info("Sending data to bStats: " + data); - } - HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); - - // Compress the data to save bandwidth - byte[] compressedData = compress(data.toString()); - - // Add headers - connection.setRequestMethod("POST"); - connection.addRequestProperty("Accept", "application/json"); - connection.addRequestProperty("Connection", "close"); - connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request - connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); - connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format - connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); - - // Send data - connection.setDoOutput(true); - try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { - outputStream.write(compressedData); - } - - StringBuilder builder = new StringBuilder(); - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - builder.append(line); - } - } - - if (logResponseStatusText) { - plugin.getLogger().info("Sent data to bStats and received response: " + builder); - } - } - - /** - * Gzips the given String. - * - * @param str The string to gzip. - * @return The gzipped String. - * @throws IOException If the compression failed. - */ - private static byte[] compress(final String str) throws IOException { - if (str == null) { - return null; - } - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { - gzip.write(str.getBytes(StandardCharsets.UTF_8)); - } - return outputStream.toByteArray(); - } - - /** - * Checks if bStats is enabled. - * - * @return Whether bStats is enabled or not. - */ - public boolean isEnabled() { - return enabled; - } - - /** - * Adds a custom chart. - * - * @param chart The chart to add. - */ - public void addCustomChart(CustomChart chart) { - if (chart == null) { - throw new IllegalArgumentException("Chart cannot be null!"); - } - charts.add(chart); - } - - /** - * Starts the Scheduler which submits our data every 30 minutes. - */ - private void startSubmitting() { - final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags - timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - if (!plugin.isEnabled()) { // Plugin was disabled - timer.cancel(); - return; - } - // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler - // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) - Bukkit.getScheduler().runTask(plugin, () -> submitData()); - } - }, 1000 * 60 * 5, 1000 * 60 * 30); - // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start - // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! - // WARNING: Just don't do it! - } - - /** - * Gets the plugin specific data. - * This method is called using Reflection. - * - * @return The plugin specific data. - */ - public JsonObject getPluginData() { - JsonObject data = new JsonObject(); - - String pluginName = plugin.getDescription().getName(); - String pluginVersion = plugin.getDescription().getVersion(); - - data.addProperty("pluginName", pluginName); // Append the name of the plugin - data.addProperty("id", pluginId); // Append the id of the plugin - data.addProperty("pluginVersion", pluginVersion); // Append the version of the plugin - JsonArray customCharts = new JsonArray(); - for (CustomChart customChart : charts) { - // Add the data of the custom charts - JsonObject chart = customChart.getRequestJsonObject(); - if (chart == null) { // If the chart is null, we skip it - continue; - } - customCharts.add(chart); - } - data.add("customCharts", customCharts); - - return data; - } - - /** - * Gets the server specific data. - * - * @return The server specific data. - */ - private JsonObject getServerData() { - // Minecraft specific data - int playerAmount; - try { - // Around MC 1.8 the return type was changed to a collection from an array, - // This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; - Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); - playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class) - ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() - : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; - } catch (Exception e) { - playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed - } - int onlineMode = Bukkit.getOnlineMode() ? 1 : 0; - String bukkitVersion = Bukkit.getVersion(); - String bukkitName = Bukkit.getName(); - - // OS/Java specific data - String javaVersion = System.getProperty("java.version"); - String osName = System.getProperty("os.name"); - String osArch = System.getProperty("os.arch"); - String osVersion = System.getProperty("os.version"); - int coreCount = Runtime.getRuntime().availableProcessors(); - - JsonObject data = new JsonObject(); - - data.addProperty("serverUUID", serverUUID); - - data.addProperty("playerAmount", playerAmount); - data.addProperty("onlineMode", onlineMode); - data.addProperty("bukkitVersion", bukkitVersion); - data.addProperty("bukkitName", bukkitName); - - data.addProperty("javaVersion", javaVersion); - data.addProperty("osName", osName); - data.addProperty("osArch", osArch); - data.addProperty("osVersion", osVersion); - data.addProperty("coreCount", coreCount); - - return data; - } - - /** - * Collects the data and sends it afterwards. - */ - private void submitData() { - final JsonObject data = getServerData(); - - JsonArray pluginData = new JsonArray(); - // Search for all other bStats Metrics classes to get their plugin data - for (Class service : Bukkit.getServicesManager().getKnownServices()) { - try { - service.getField("B_STATS_VERSION"); // Our identifier :) - - for (RegisteredServiceProvider provider : Bukkit.getServicesManager().getRegistrations(service)) { - try { - Object plugin = provider.getService().getMethod("getPluginData").invoke(provider.getProvider()); - if (plugin instanceof JsonObject) { - pluginData.add((JsonObject) plugin); - } else { // old bstats version compatibility - try { - Class jsonObjectJsonSimple = Class.forName("org.json.simple.JSONObject"); - if (plugin.getClass().isAssignableFrom(jsonObjectJsonSimple)) { - Method jsonStringGetter = jsonObjectJsonSimple.getDeclaredMethod("toJSONString"); - jsonStringGetter.setAccessible(true); - String jsonString = (String) jsonStringGetter.invoke(plugin); - JsonObject object = new JsonParser().parse(jsonString).getAsJsonObject(); - pluginData.add(object); - } - } catch (ClassNotFoundException e) { - // minecraft version 1.14+ - if (logFailedRequests) { - this.plugin.getLogger().log(Level.SEVERE, "Encountered unexpected exception", e); - } - } - } - } catch (NullPointerException | NoSuchMethodException | IllegalAccessException | - InvocationTargetException ignored) { - } - } - } catch (NoSuchFieldException ignored) { - } - } - - data.add("plugins", pluginData); - - // Create a new thread for the connection to the bStats server - new Thread(() -> { - try { - // Send the data - sendData(plugin, data); - } catch (Exception e) { - // Something went wrong! :( - if (logFailedRequests) { - plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); - } - } - }).start(); - } - - /** - * Represents a custom chart. - */ - public static abstract class CustomChart { - - // The id of the chart - final String chartId; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - */ - CustomChart(String chartId) { - if (chartId == null || chartId.isEmpty()) { - throw new IllegalArgumentException("ChartId cannot be null or empty!"); - } - this.chartId = chartId; - } - - private JsonObject getRequestJsonObject() { - JsonObject chart = new JsonObject(); - chart.addProperty("chartId", chartId); - try { - JsonObject data = getChartData(); - if (data == null) { - // If the data is null we don't send the chart. - return null; - } - chart.add("data", data); - } catch (Throwable t) { - if (logFailedRequests) { - Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t); - } - return null; - } - return chart; - } - - protected abstract JsonObject getChartData() throws Exception; - - } - - /** - * Represents a custom simple pie. - */ - public static class SimplePie extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimplePie(String chartId, Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - String value = callable.call(); - if (value == null || value.isEmpty()) { - // Null = skip the chart - return null; - } - data.addProperty("value", value); - return data; - } - } - - /** - * Represents a custom advanced pie. - */ - public static class AdvancedPie extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedPie(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.addProperty(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - - /** - * Represents a custom drilldown pie. - */ - public static class DrilldownPie extends CustomChart { - - private final Callable>> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public DrilldownPie(String chartId, Callable>> callable) { - super(chartId); - this.callable = callable; - } - - @Override - public JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map> map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean reallyAllSkipped = true; - for (Map.Entry> entryValues : map.entrySet()) { - JsonObject value = new JsonObject(); - boolean allSkipped = true; - for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { - value.addProperty(valueEntry.getKey(), valueEntry.getValue()); - allSkipped = false; - } - if (!allSkipped) { - reallyAllSkipped = false; - values.add(entryValues.getKey(), value); - } - } - if (reallyAllSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - - /** - * Represents a custom single line chart. - */ - public static class SingleLineChart extends CustomChart { - - private final Callable callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SingleLineChart(String chartId, Callable callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - int value = callable.call(); - if (value == 0) { - // Null = skip the chart - return null; - } - data.addProperty("value", value); - return data; - } - - } - - /** - * Represents a custom multi line chart. - */ - public static class MultiLineChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public MultiLineChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() == 0) { - continue; // Skip this invalid - } - allSkipped = false; - values.addProperty(entry.getKey(), entry.getValue()); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - - } - - /** - * Represents a custom simple bar chart. - */ - public static class SimpleBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public SimpleBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - for (Map.Entry entry : map.entrySet()) { - JsonArray categoryValues = new JsonArray(); - categoryValues.add(new JsonPrimitive(entry.getValue())); - values.add(entry.getKey(), categoryValues); - } - data.add("values", values); - return data; - } - - } - - /** - * Represents a custom advanced bar chart. - */ - public static class AdvancedBarChart extends CustomChart { - - private final Callable> callable; - - /** - * Class constructor. - * - * @param chartId The id of the chart. - * @param callable The callable which is used to request the chart data. - */ - public AdvancedBarChart(String chartId, Callable> callable) { - super(chartId); - this.callable = callable; - } - - @Override - protected JsonObject getChartData() throws Exception { - JsonObject data = new JsonObject(); - JsonObject values = new JsonObject(); - Map map = callable.call(); - if (map == null || map.isEmpty()) { - // Null = skip the chart - return null; - } - boolean allSkipped = true; - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue().length == 0) { - continue; // Skip this invalid - } - allSkipped = false; - JsonArray categoryValues = new JsonArray(); - for (int categoryValue : entry.getValue()) { - categoryValues.add(new JsonPrimitive(categoryValue)); - } - values.add(entry.getKey(), categoryValues); - } - if (allSkipped) { - // Null = skip the chart - return null; - } - data.add("values", values); - return data; - } - } - -} diff --git a/UltiTools-API/src/main/resources/env.yml b/UltiTools-API/src/main/resources/env.yml index 3b17b89..902c489 100644 --- a/UltiTools-API/src/main/resources/env.yml +++ b/UltiTools-API/src/main/resources/env.yml @@ -1,36 +1,38 @@ # This file is used to store environment variables -version: ${project.version} + api-url: "https://api.v2.ultikits.com" oss-url: "https://ultitools.oss-cn-shanghai.aliyuncs.com" lib-path: "/lib/" libraries: - - "advancedslot-4.3.0.jar" - - "adventure-api-4.13.1.jar" - - "adventure-key-4.13.1.jar" - - "adventure-nbt-4.13.1.jar" - - "adventure-platform-api-4.3.2.jar" - - "adventure-platform-bukkit-4.3.2.jar" - - "adventure-platform-facet-4.3.2.jar" - - "adventure-platform-viaversion-4.3.2.jar" - - "adventure-text-serializer-bungeecord-4.3.2.jar" - - "adventure-text-serializer-gson-4.13.1.jar" - - "adventure-text-serializer-gson-legacy-impl-4.13.1.jar" - - "adventure-text-serializer-legacy-4.13.1.jar" - - "annotations-23.0.0.jar" - - "configurablegui-4.3.0.jar" - - "core-4.3.0.jar" + - "advancedslot-4.1.13.jar" + - "adventure-api-4.13.0.jar" + - "adventure-key-4.13.0.jar" + - "adventure-nbt-4.13.0.jar" + - "adventure-platform-api-4.3.0.jar" + - "adventure-platform-bukkit-4.3.0.jar" + - "adventure-platform-facet-4.3.0.jar" + - "adventure-platform-viaversion-4.3.0.jar" + - "adventure-text-serializer-bungeecord-4.3.0.jar" + - "adventure-text-serializer-gson-4.13.0.jar" + - "adventure-text-serializer-gson-legacy-impl-4.13.0.jar" + - "adventure-text-serializer-legacy-4.13.0.jar" + - "annotations-24.0.1.jar" + - "bukkit-1.13.1-R0.1-SNAPSHOT.jar" + - "bungeecord-chat-1.16-R0.4.jar" + - "checker-qual-3.12.0.jar" + - "commons-lang-2.6.jar" + - "configurablegui-4.1.13.jar" + - "core-4.1.13.jar" + - "error_prone_annotations-2.11.0.jar" - "examination-api-1.3.0.jar" - "examination-string-1.3.0.jar" + - "failureaccess-1.0.1.jar" - "fastjson-1.2.83.jar" - - "hutool-cache-5.8.25.jar" - - "hutool-core-5.8.25.jar" - - "hutool-cron-5.8.25.jar" - - "hutool-crypto-5.8.25.jar" - - "hutool-db-5.8.25.jar" - - "hutool-http-5.8.25.jar" - - "hutool-json-5.8.25.jar" - - "hutool-log-5.8.25.jar" - - "hutool-setting-5.8.25.jar" + - "gson-2.10.jar" + - "guava-31.1-jre.jar" + - "hamcrest-core-1.1.jar" + - "hutool-all-5.8.20.jar" + - "j2objc-annotations-1.3.jar" - "javax.servlet-api-3.1.0.jar" - "jetty-client-9.4.48.v20220622.jar" - "jetty-http-9.4.48.v20220622.jar" @@ -42,12 +44,21 @@ libraries: - "jetty-util-ajax-9.4.48.v20220622.jar" - "jetty-webapp-9.4.48.v20220622.jar" - "jetty-xml-9.4.48.v20220622.jar" - - "obliviate-invs-4.3.0.jar" + - "json-simple-1.1.1.jar" + - "jsr305-3.0.2.jar" + - "junit-4.10.jar" + - "listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" + - "lombok-1.18.24.jar" + - "mysql-connector-j-8.0.33.jar" + - "obliviate-invs-4.1.13.jar" - "obliviate-utils-2.0.5.jar" - - "pagination-4.3.0.jar" + - "pagination-4.1.13.jar" - "placeholder-2.0.5.jar" + - "protobuf-java-3.21.9.jar" - "slf4j-api-1.7.25.jar" + - "snakeyaml-1.33.jar" - "spark-core-2.9.4.jar" + - "spigot-api-1.19.3-R0.1-SNAPSHOT.jar" - "spring-aop-5.3.31.jar" - "spring-beans-5.3.31.jar" - "spring-context-5.3.31.jar" @@ -55,10 +66,10 @@ libraries: - "spring-expression-5.3.31.jar" - "spring-jcl-5.3.31.jar" - "string-2.0.5.jar" - - "UniversalScheduler-0.1.6.jar" + - "VaultAPI-1.7.jar" - "version-detection-2.0.5.jar" - "websocket-api-9.4.48.v20220622.jar" - "websocket-client-9.4.48.v20220622.jar" - "websocket-common-9.4.48.v20220622.jar" - "websocket-server-9.4.48.v20220622.jar" - - "websocket-servlet-9.4.48.v20220622.jar" + - "websocket-servlet-9.4.48.v20220622.jar" \ No newline at end of file diff --git a/UltiTools-API/src/main/resources/lang/en.json b/UltiTools-API/src/main/resources/lang/en.json index ba07e2a..5a195eb 100644 --- a/UltiTools-API/src/main/resources/lang/en.json +++ b/UltiTools-API/src/main/resources/lang/en.json @@ -28,7 +28,7 @@ " 简介:": " Intro:", "======== 第%d页 ========": "======== Page %d ========", "安装失败!": "Install Failed!", - "安装成功!请重启服务器!请务必删除旧版本模块!": "Installed! Please restart the server! Please be sure to delete the old version module!", + "安装成功!请重启服务器!": "Installed! Please restart the server!", "========|插件安装帮助|========": "========|Plugin Install Help|========", "/upm list [页数] - 查看可用插件列表": "/upm list [page] - View available plugin list", "/upm install [插件] - 安装最新插件": "/upm install [plugin] - Install latest plugin", diff --git a/UltiTools-API/src/main/resources/plugin.yml b/UltiTools-API/src/main/resources/plugin.yml index 03990ae..225f2ec 100755 --- a/UltiTools-API/src/main/resources/plugin.yml +++ b/UltiTools-API/src/main/resources/plugin.yml @@ -4,8 +4,5 @@ main: com.ultikits.ultitools.UltiTools api-version: 1.13 prefix: UltiTools authors: [ wisdomme ] -load: POSTWORLD +load: STARTUP depend: [ Vault, PlaceholderAPI ] -softdepend: - - Vault - - PlaceholderAPI From 709db125321fda1d183990c47b0cd8195023d924 Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:40:18 +1100 Subject: [PATCH 26/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 36 +++++++++++----------------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index 1043636..c95e797 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -37,17 +37,13 @@ jobs: name: ultitools-artifact path: UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar - release: + release: needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Get latest commit message - id: commit - run: echo "::set-output name=message::$(git log --format=%B -n 1 ${{ github.sha }})" - - name: Get Project Version from pom.xml id: version uses: avides/actions-project-version-check@v1.4.0 @@ -66,7 +62,6 @@ jobs: uses: actions/github-script@v5 with: script: | - // 获取最新合并的 PR const { data: pullRequests } = await github.rest.pulls.list({ owner: context.repo.owner, repo: context.repo.repo, @@ -76,20 +71,9 @@ jobs: per_page: 1 }); const mergedPR = pullRequests.find(pr => pr.merged_at); - - // 获取该 PR 的第一条评论 - const comments = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: mergedPR.number, - per_page: 1 - }); - - // 设置输出 return { - id: mergedPR.number, title: mergedPR.title, - first_comment: comments.data.length > 0 ? comments.data[0].body : 'No comments found' + body: mergedPR.body }; result-encoding: json @@ -99,19 +83,21 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} with: - tag_name: v${{ steps.get-pr.outputs.id }} - release_name: Release ${{ steps.get-pr.outputs.title }} - body: ${{ steps.get-pr.outputs.body }} + tag_name: v${{ steps.version.outputs.version }} + release_name: Release ${{ steps.version.outputs.version }} + body: | + # ${{ steps.get-pr.outputs.title }} + ${{ steps.get-pr.outputs.body }} draft: false prerelease: false - + - name: Upload Release Asset - id: upload-release-asset uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: UltiTools-API-${{ steps.version.outputs.version }}.jar - asset_name: UltiTools-API.jar + asset_path: ./UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar + asset_name: UltiTools-API-${{ steps.version.outputs.version }}.jar asset_content_type: application/java-archive + From 10ca1956f6aa9f2275031d28505fd9f153072044 Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:43:22 +1100 Subject: [PATCH 27/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index c95e797..ad377e3 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -37,7 +37,7 @@ jobs: name: ultitools-artifact path: UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar - release: + release: needs: build runs-on: ubuntu-latest From 64821e1a16668ab87746da29a7e0b61792e65554 Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 19:45:32 +1100 Subject: [PATCH 28/33] Revert "Release 6.0.5" --- BasicFunctions/pom.xml | 24 +- .../com/ultikits/plugins/BasicFunctions.java | 104 +-- .../plugins/commands/BackCommands.java | 19 +- .../plugins/commands/BanCommands.java | 8 +- .../plugins/commands/FlyCommands.java | 23 +- .../plugins/commands/GMChangeCommand.java | 88 +-- .../plugins/commands/HealCommand.java | 32 +- .../plugins/commands/HideCommands.java | 69 ++ .../plugins/commands/LoreCommands.java | 152 ++++ .../plugins/commands/RandomTpCommands.java | 24 +- .../plugins/commands/SetSpawnCommands.java | 38 + .../plugins/commands/SpawnCommands.java | 37 + .../plugins/commands/SpeedCommands.java | 44 +- .../plugins/commands/TpaCommands.java | 130 ++-- .../plugins/commands/TpaHereCommands.java | 122 ++- .../plugins/commands/WarpCommands.java | 96 +++ .../plugins/commands/WhitelistCommands.java | 118 ++- .../ultikits/plugins/config/BasicConfig.java | 12 + .../plugins/config/DeathPunishmentConfig.java | 41 + .../plugins/config/PlayerNameTagConfig.java | 25 + .../ultikits/plugins/config/WarpConfig.java | 23 + .../com/ultikits/plugins/data/WarpData.java | 23 + .../ultikits/plugins/data/WhiteListData.java | 2 + .../com/ultikits/plugins/guis/WarpGui.java | 52 ++ .../plugins/listeners/BackListener.java | 2 + .../plugins/listeners/BanListener.java | 6 +- .../plugins/listeners/DeathListener.java | 45 ++ .../plugins/listeners/HideListener.java | 15 + .../listeners/JoinWelcomeListener.java | 2 + .../listeners/PlayerNameTagListener.java | 32 + .../plugins/listeners/WhitelistListener.java | 6 +- .../plugins/services/DeathPunishService.java | 55 ++ .../plugins/services/WarpService.java | 117 +++ .../plugins/services/WhiteListService.java | 2 + .../plugins/tasks/DeathPunishmentTask.java | 87 +++ .../plugins/tasks/NamePrefixSuffixTask.java | 30 + .../ultikits/plugins/utils/TitlesUtils.java | 49 ++ .../src/main/resources/config/config.yml | 12 + .../src/main/resources/config/death.yml | 38 + .../src/main/resources/config/title.yml | 8 + .../src/main/resources/config/warp.yml | 6 + .../src/main/resources/lang/en.json | 35 +- BasicFunctions/src/main/resources/plugin.yml | 2 +- Economy/pom.xml | 4 +- Home/pom.xml | 8 +- .../com/ultikits/plugins/home/PluginMain.java | 10 +- .../plugins/home/commands/HomeCommands.java | 9 +- .../plugins/home/gui/HomeListGui.java | 8 +- Home/src/main/resources/plugin.yml | 2 +- MysqlConnector/pom.xml | 2 +- Sidebar/pom.xml | 8 +- .../plugins/sidebar/PlayerJoinListener.java | 16 +- .../ultikits/plugins/sidebar/SbCommand.java | 37 + .../plugins/sidebar/SidebarConfig.java | 8 +- .../plugins/sidebar/SidebarPlugin.java | 28 +- .../ultikits/plugins/sidebar/UpdateTask.java | 14 +- Sidebar/src/main/resources/plugin.yml | 4 +- UltiTools-API/pom.xml | 62 +- .../com/ultikits/ultitools/UltiTools.java | 55 +- .../abstracts/AbstractCommendExecutor.java | 269 +++---- .../ultitools/abstracts/UltiToolsPlugin.java | 87 ++- .../abstracts/guis/OkCancelPage.java | 7 +- .../ultitools/abstracts/guis/PagingPage.java | 18 +- .../annotations/EnableAutoRegister.java | 6 +- .../ultitools/annotations/EventListener.java | 10 +- .../ultikits/ultitools/annotations/I18n.java | 8 +- .../annotations/UltiToolsModule.java | 36 + .../annotations/command/CmdExecutor.java | 8 + .../commands/PluginInstallCommands.java | 4 +- .../ultitools/commands/UltiToolsCommands.java | 5 +- .../entities/common/WorldLocation.java | 5 + .../ultitools/interfaces/IPlugin.java | 3 +- .../ultitools/interfaces/Localized.java | 6 +- .../interfaces/TempEventHandler.java | 8 + .../ultitools/interfaces/TempListener.java | 12 + .../interfaces/impl/PlayerTempListener.java | 55 ++ .../impl/SimpleJsonDataOperator.java | 2 +- .../interfaces/impl/SimpleTempListener.java | 41 + .../listeners/PlayerJoinListener.java | 54 ++ .../ultitools/manager/CommandManager.java | 112 ++- .../ultitools/manager/DataStoreManager.java | 2 +- .../ultitools/manager/ListenerManager.java | 14 + .../ultitools/manager/PluginManager.java | 59 +- .../ultikits/ultitools/utils/CommonUtils.java | 12 + .../com/ultikits/ultitools/utils/Metrics.java | 713 ++++++++++++++++++ UltiTools-API/src/main/resources/env.yml | 69 +- UltiTools-API/src/main/resources/lang/en.json | 2 +- UltiTools-API/src/main/resources/plugin.yml | 5 +- 88 files changed, 3021 insertions(+), 741 deletions(-) create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/HideCommands.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/LoreCommands.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/SetSpawnCommands.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpawnCommands.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/commands/WarpCommands.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/config/DeathPunishmentConfig.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/config/PlayerNameTagConfig.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/config/WarpConfig.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/data/WarpData.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/guis/WarpGui.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/listeners/DeathListener.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/listeners/HideListener.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/listeners/PlayerNameTagListener.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/services/DeathPunishService.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/services/WarpService.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/tasks/DeathPunishmentTask.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/tasks/NamePrefixSuffixTask.java create mode 100644 BasicFunctions/src/main/java/com/ultikits/plugins/utils/TitlesUtils.java create mode 100644 BasicFunctions/src/main/resources/config/death.yml create mode 100644 BasicFunctions/src/main/resources/config/title.yml create mode 100644 BasicFunctions/src/main/resources/config/warp.yml create mode 100644 Sidebar/src/main/java/com/ultikits/plugins/sidebar/SbCommand.java create mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/UltiToolsModule.java create mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempEventHandler.java create mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempListener.java create mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/PlayerTempListener.java create mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleTempListener.java create mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/listeners/PlayerJoinListener.java create mode 100644 UltiTools-API/src/main/java/com/ultikits/ultitools/utils/Metrics.java diff --git a/BasicFunctions/pom.xml b/BasicFunctions/pom.xml index 4643b70..ae5173e 100644 --- a/BasicFunctions/pom.xml +++ b/BasicFunctions/pom.xml @@ -6,7 +6,7 @@ com.ultikits.plugins BasicFunctions - 1.0.0 + 1.0.4 8 @@ -18,7 +18,7 @@ com.ultikits UltiTools-API - 6.0.3 + 6.0.5 provided @@ -45,9 +45,25 @@ 1.18.24 provided + + com.nametagedit + nametagedit + 4.4.16 + provided + + + com.github.BlueMap-Minecraft + BlueMapAPI + v2.6.2 + provided + + + upstream + https://ci.nametagedit.com/plugin/repository/everything/ + spigotmc-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ @@ -76,9 +92,9 @@ BasicFunctions UltiTools-Basic-Functions - All basic functions of the UltiTools + 开服必装!所有的杂七杂八的小功能哦!包括不限于TPA,飞行,模式更改,白名单,随机传送。 access_key.txt - F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins + F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/BasicFunctions.java b/BasicFunctions/src/main/java/com/ultikits/plugins/BasicFunctions.java index dc6303e..210a0da 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/BasicFunctions.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/BasicFunctions.java @@ -3,25 +3,22 @@ package com.ultikits.plugins; import com.ultikits.plugins.commands.*; import com.ultikits.plugins.config.BasicConfig; import com.ultikits.plugins.config.JoinWelcomeConfig; -import com.ultikits.plugins.listeners.BackListener; -import com.ultikits.plugins.listeners.BanListener; -import com.ultikits.plugins.listeners.JoinWelcomeListener; -import com.ultikits.plugins.listeners.WhitelistListener; +import com.ultikits.plugins.config.PlayerNameTagConfig; +import com.ultikits.plugins.config.WarpConfig; +import com.ultikits.plugins.listeners.*; +import com.ultikits.plugins.services.WarpService; +import com.ultikits.plugins.tasks.NamePrefixSuffixTask; +import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.abstracts.AbstractConfigEntity; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; -//import com.ultikits.ultitools.annotations.ContextEntry; -//import com.ultikits.ultitools.annotations.EnableAutoRegister; +import com.ultikits.ultitools.annotations.UltiToolsModule; +import de.bluecolored.bluemap.api.BlueMapAPI; import lombok.Getter; -import java.io.IOException; import java.util.Arrays; import java.util.List; -//@EnableAutoRegister( -// scanPackage = "com.ultikits.plugins", -// eventListener = false, -// cmdExecutor = false -//) +@UltiToolsModule public class BasicFunctions extends UltiToolsPlugin { @Getter private static BasicFunctions instance; @@ -32,74 +29,85 @@ public class BasicFunctions extends UltiToolsPlugin { } @Override - public boolean registerSelf() throws IOException { + public boolean registerSelf() { BasicConfig configEntity = getConfigManager().getConfigEntity(this, BasicConfig.class); if (configEntity.isEnableHeal()) { - getCommandManager().register(new HealCommand(), "ultikits.tools.command.heal", i18n("指令治愈功能"), "heal", "h"); + getCommandManager().register(this, HideCommands.class); } if (configEntity.isEnableGmChange()) { - getCommandManager().register(new GMChangeCommand(), "ultikits.tools.command.gm", i18n("游戏模式切换功能"), "gm"); + getCommandManager().register(this, GMChangeCommand.class); } if (configEntity.isEnableBack()) { - getCommandManager().register(new BackCommands(), "ultikits.tools.command.back", i18n("快捷返回功能"), "back"); - getListenerManager().register(this, new BackListener()); + getCommandManager().register(this, BackCommands.class); + getListenerManager().register(this, BackListener.class); } if (configEntity.isEnableRandomTeleport()) { - getCommandManager().register(new RandomTpCommands(), "ultikits.tools.command.wild", i18n("随机传送功能"), "wild"); + getCommandManager().register(this, RandomTpCommands.class); } if (configEntity.isEnableFly()) { - getCommandManager().register(new FlyCommands(), "ultikits.tools.command.fly", i18n("飞行功能"), "fly"); + getCommandManager().register(this, FlyCommands.class); } if (configEntity.isEnableWhitelist()) { - getCommandManager().register(new WhitelistCommands(), "ultikits.tools.whitelist", i18n("白名单功能"), "wl"); - getListenerManager().register(this, new WhitelistListener()); + getCommandManager().register(this, WhitelistCommands.class); + getListenerManager().register(this, WhitelistListener.class); } if (configEntity.isEnableJoinWelcome()) { - getListenerManager().register(this, new JoinWelcomeListener()); + getListenerManager().register(this, JoinWelcomeListener.class); } if (configEntity.isEnableTpa()) { - getCommandManager().register(new TpaCommands(), "ultikits.tools.command.tpa", i18n("传送请求功能"), "tpa"); - getCommandManager().register(new TpaHereCommands(), "ultikits.tools.command.tphere", i18n("请求传送到此功能"), "tphere"); + getCommandManager().register(this, TpaCommands.class); + getCommandManager().register(this, TpaHereCommands.class); } if (configEntity.isEnableSpeed()) { - getCommandManager().register(new SpeedCommands(), "ultikits.tools.command.speed", i18n("速度设置功能"), "speed"); + getCommandManager().register(this, SpeedCommands.class); } if (configEntity.isEnableBan()) { - getCommandManager().register(new BanCommands(), "ultikits.tools.command.uban", i18n("封禁功能"), "uban"); - getListenerManager().register(this, new BanListener()); + getCommandManager().register(this, BanCommands.class); + getListenerManager().register(this, BanListener.class); + } + if (configEntity.isEnableWarp()) { + getCommandManager().register(this, WarpCommands.class); + WarpConfig warpConfig = getConfigManager().getConfigEntity(this, WarpConfig.class); + if (warpConfig.isEnableBlueMap()) { + BlueMapAPI.onEnable(api -> { + WarpService warpService = getContext().getBean(WarpService.class); + warpService.initBlueMap(); + }); + } + } + if (configEntity.isEnableSpawn()) { + getCommandManager().register(this, SpawnCommands.class); + getCommandManager().register(this, SetSpawnCommands.class); + } + if (configEntity.isEnableLoreEditor()) { + getCommandManager().register(this, LoreCommands.class); + } + if (configEntity.isEnableHide()) { + getCommandManager().register(this, HideCommands.class); + getListenerManager().register(this, HideListener.class); + } + if (configEntity.isEnableTitle()) { + getListenerManager().register(this, PlayerNameTagListener.class); + int updateInterval = getConfig(PlayerNameTagConfig.class).getUpdateInterval(); + new NamePrefixSuffixTask().runTaskTimer(UltiTools.getInstance(), 0, updateInterval); + } + if (configEntity.isEnableDeathPunishment()) { + getListenerManager().register(this, DeathListener.class); } return true; } - @Override - public void unregisterSelf() { - getCommandManager().unregister("heal"); - getCommandManager().unregister("gm"); - getCommandManager().unregister("back"); - getCommandManager().unregister("wild"); - getCommandManager().unregister("fly"); - getCommandManager().unregister("wl"); - getCommandManager().unregister("tpa"); - getCommandManager().unregister("tphere"); - getCommandManager().unregister("speed"); - getListenerManager().unregisterAll(this); - } - - @Override - public void reloadSelf() { - getConfigManager().reloadConfigs(this); - } - @Override public List supported() { - return super.supported(); + return Arrays.asList("zh", "en"); } @Override public List getAllConfigs() { return Arrays.asList( new BasicConfig("config/config.yml"), - new JoinWelcomeConfig("config/join.yml") + new JoinWelcomeConfig("config/join.yml"), + new PlayerNameTagConfig("config/title.yml") ); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BackCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BackCommands.java index 44b1278..fc1af0d 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BackCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BackCommands.java @@ -2,28 +2,33 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.listeners.BackListener; -import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; import org.bukkit.Location; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import static com.ultikits.ultitools.utils.MessageUtils.warning; -public class BackCommands extends AbstractPlayerCommandExecutor { - @Override - protected boolean onPlayerCommand(Command command, String[] strings, Player player) { +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"back"}, manualRegister = true, permission = "ultikits.tools.command.back", description = "返回死亡地点") +public class BackCommands extends AbstractCommendExecutor { + + @CmdMapping(format = "") + public void back(@CmdSender Player player) { Location location = BackListener.getPlayerLastDeathLocation(player.getUniqueId()); if (location != null) { player.teleport(location); } else { player.sendMessage(warning(BasicFunctions.getInstance().i18n("无法找到死亡地点!这可能是因为插件重载或者你还没死过哩。"))); } - return true; } @Override - protected void sendHelpMessage(CommandSender sender) { + protected void handleHelp(CommandSender sender) { sender.sendMessage(BasicFunctions.getInstance().i18n("/back 返回死亡地点")); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BanCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BanCommands.java index 6276cbc..0b9df72 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BanCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/BanCommands.java @@ -11,11 +11,10 @@ import org.springframework.beans.factory.annotation.Autowired; @CmdTarget(CmdTarget.CmdTargetType.BOTH) -@CmdExecutor(permission = "ultikits.ban.command.all", description = "Ban功能", alias = {"uban"}) +@CmdExecutor(permission = "ultikits.ban.command.all", description = "封禁功能", alias = {"uban"}, manualRegister = true) public class BanCommands extends AbstractCommendExecutor { - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") @Autowired - private BanPlayerService banPlayerService = new BanPlayerService(); + private BanPlayerService banPlayerService; @CmdMapping(format = "ban ") public void banPlayer(@CmdSender CommandSender sender, @CmdParam("player") String player, @CmdParam("reason") String reason) { @@ -36,6 +35,7 @@ public class BanCommands extends AbstractCommendExecutor { @Override protected void handleHelp(CommandSender sender) { - + sender.sendMessage(BasicFunctions.getInstance().i18n("§c/uban ban §7封禁玩家")); + sender.sendMessage(BasicFunctions.getInstance().i18n("§c/uban unban §7解封玩家")); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/FlyCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/FlyCommands.java index 69cb4c4..585b152 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/FlyCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/FlyCommands.java @@ -1,31 +1,30 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor; -import org.bukkit.command.Command; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import static com.ultikits.ultitools.utils.MessageUtils.info; -import static com.ultikits.ultitools.utils.MessageUtils.warning; -public class FlyCommands extends AbstractPlayerCommandExecutor { +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"fly"}, manualRegister = true, permission = "ultikits.tools.command.fly", description = "飞行功能") +public class FlyCommands extends AbstractCommendExecutor { - @Override - protected boolean onPlayerCommand(Command command, String[] strings, Player player) { - if (!player.hasPermission("ultikits.tools.command.fly")) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; - } + @CmdMapping(format = "") + public void fly(@CmdSender Player player) { player.setAllowFlight(!player.getAllowFlight()); player.sendMessage(info(player.getAllowFlight() ? BasicFunctions.getInstance().i18n("已打开飞行") : BasicFunctions.getInstance().i18n("已关闭飞行"))); - return true; } @Override - protected void sendHelpMessage(CommandSender sender) { + protected void handleHelp(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("用法:/fly"))); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/GMChangeCommand.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/GMChangeCommand.java index bfea042..825a878 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/GMChangeCommand.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/GMChangeCommand.java @@ -1,78 +1,46 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractTabExecutor; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; import org.bukkit.ChatColor; import org.bukkit.GameMode; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.Arrays; -import java.util.List; +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"gm"}, manualRegister = true, permission = "ultikits.tools.command.gm", description = "游戏模式切换功能") +public class GMChangeCommand extends AbstractCommendExecutor { -import static com.ultikits.ultitools.utils.MessageUtils.warning; + @CmdMapping(format = "0", permission = "ultikits.tools.command.gm.0") + public void changeGameMode0(@CmdSender Player player, String mode) { + player.setGameMode(GameMode.SURVIVAL); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("生存模式"))); + } -public class GMChangeCommand extends AbstractTabExecutor { - @Override - protected boolean onPlayerCommand(Command command, String[] strings, Player player) { - if (player.hasPermission("ultikits.tools.command.gm.all") - || player.hasPermission("ultikits.tools.command.gm.0") - || player.hasPermission("ultikits.tools.command.gm.1") - || player.hasPermission("ultikits.tools.command.gm.2") - || player.hasPermission("ultikits.tools.command.gm.3")) { - switch (strings[0]) { - case "0": - if (player.hasPermission("ultikits.tools.command.gm.all") - || player.hasPermission("ultikits.tools.command.gm.0")) { - player.setGameMode(GameMode.SURVIVAL); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("生存模式"))); - return true; - } - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; - case "1": - if (player.hasPermission("ultikits.tools.command.gm.all") - || player.hasPermission("ultikits.tools.command.gm.1")) { - player.setGameMode(GameMode.CREATIVE); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("创造模式"))); - return true; - } - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; - case "2": - if (player.hasPermission("ultikits.tools.command.gm.all") - || player.hasPermission("ultikits.tools.command.gm.2")) { - player.setGameMode(GameMode.ADVENTURE); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("冒险模式"))); - return true; - } - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; - case "3": - if (player.hasPermission("ultikits.tools.command.gm.all") - || player.hasPermission("ultikits.tools.command.gm.3")) { - player.setGameMode(GameMode.SPECTATOR); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("旁观模式"))); - return true; - } - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; - default: - return false; - } - } - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; + @CmdMapping(format = "1", permission = "ultikits.tools.command.gm.1") + public void changeGameMode1(@CmdSender Player player, String mode) { + player.setGameMode(GameMode.CREATIVE); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("创造模式"))); } - @Override - protected List onPlayerTabComplete(Command command, String[] strings, Player player) { - return Arrays.asList("0", "1", "2", "3"); + @CmdMapping(format = "2", permission = "ultikits.tools.command.gm.2") + public void changeGameMode2(@CmdSender Player player, String mode) { + player.setGameMode(GameMode.ADVENTURE); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("冒险模式"))); + } + + @CmdMapping(format = "3", permission = "ultikits.tools.command.gm.3") + public void changeGameMode3(@CmdSender Player player, String mode) { + player.setGameMode(GameMode.SPECTATOR); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("你的游戏模式已设置为%s"), BasicFunctions.getInstance().i18n("旁观模式"))); } @Override - protected void sendHelpMessage(CommandSender sender) { + protected void handleHelp(CommandSender sender) { sender.sendMessage(ChatColor.YELLOW + "/gm <0/1/2/3>"); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HealCommand.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HealCommand.java index bd99baa..b452957 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HealCommand.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HealCommand.java @@ -1,30 +1,28 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; import org.bukkit.ChatColor; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import static com.ultikits.ultitools.utils.MessageUtils.warning; +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"heal", "h"}, manualRegister = true, permission = "ultikits.tools.command.heal", description = "指令治愈功能") +public class HealCommand extends AbstractCommendExecutor { -public class HealCommand extends AbstractPlayerCommandExecutor { - - @Override - protected boolean onPlayerCommand(Command command, String[] strings, Player player) { - if (player.hasPermission("ultikits.tools.command.heal")) { - player.setHealth(player.getMaxHealth()); - player.setFoodLevel(20); - player.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("你已被治愈!")); - return true; - } - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; + @CmdMapping(format = "") + public void heal(@CmdSender Player player) { + player.setHealth(player.getMaxHealth()); + player.setFoodLevel(20); + player.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("你已被治愈!")); } @Override - protected void sendHelpMessage(CommandSender sender) { - + protected void handleHelp(CommandSender sender) { + sender.sendMessage(BasicFunctions.getInstance().i18n("§c/heal §7治愈自己")); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HideCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HideCommands.java new file mode 100644 index 0000000..79cfeb1 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/HideCommands.java @@ -0,0 +1,69 @@ +package com.ultikits.plugins.commands; + +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.ultitools.UltiTools; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import static com.ultikits.ultitools.utils.MessageUtils.info; + +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"hide"}, manualRegister = true, permission = "ultikits.tools.command.hide", description = "隐身功能") +public class HideCommands extends AbstractCommendExecutor { + private static final List hidePlayers = new ArrayList<>(); + + public static void removeHidePlayer(UUID uuid) { + hidePlayers.remove(uuid); + } + + @CmdMapping(format = "") + public void hide(@CmdSender Player player) { + if (hidePlayers.contains(player.getUniqueId())) { + hidePlayers.remove(player.getUniqueId()); + new BukkitRunnable() { + @Override + public void run() { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.getUniqueId().equals(player.getUniqueId())) { + continue; + } + p.showPlayer(UltiTools.getInstance(), player); + } + } + }.runTaskAsynchronously(UltiTools.getInstance()); + player.sendMessage(info(BasicFunctions.getInstance().i18n("你已退出隐身"))); + } else { + hidePlayers.add(player.getUniqueId()); + new BukkitRunnable() { + @Override + public void run() { + for (Player p : Bukkit.getOnlinePlayers()) { + if (p.getUniqueId().equals(player.getUniqueId())) { + continue; + } + p.hidePlayer(UltiTools.getInstance(), player); + } + } + }.runTaskAsynchronously(UltiTools.getInstance()); + player.sendMessage(info(BasicFunctions.getInstance().i18n("你已进入隐身"))); + } + + } + + @Override + protected void handleHelp(CommandSender sender) { + sender.sendMessage(info(BasicFunctions.getInstance().i18n("/hide - 开启/关闭隐身"))); + } +} + diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/LoreCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/LoreCommands.java new file mode 100644 index 0000000..3f8aefe --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/LoreCommands.java @@ -0,0 +1,152 @@ +package com.ultikits.plugins.commands; + +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.*; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; + +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"lore"}, manualRegister = true, permission = "ultikits.tools.command.lore", description = "物品Lore编辑功能") +public class LoreCommands extends AbstractCommendExecutor { + + @CmdMapping(format = "add ") + public void addLore(@CmdSender Player player, @CmdParam("lore...") String[] lore) { + ItemStack itemStack = player.getInventory().getItemInMainHand(); + if (itemStack.getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore")); + return; + } + ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta()); + List loreList = itemMeta.getLore(); + if (loreList == null) { + loreList = new ArrayList<>(); + } + String loreToAdd = String.join(" ", lore); + loreList.add(coloredMsg(loreToAdd)); + itemMeta.setLore(loreList); + itemStack.setItemMeta(itemMeta); + player.getInventory().setItemInMainHand(itemStack); + player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改")); + } + + @CmdMapping(format = "delete ") + public void deleteLore(@CmdSender Player player, @CmdParam("position") int position) { + ItemStack itemStack = player.getInventory().getItemInMainHand(); + if (itemStack.getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore")); + return; + } + ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta()); + List loreList = itemMeta.getLore(); + if (loreList == null || loreList.isEmpty()) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空")); + return; + } + if (position > loreList.size() || position < 1) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("Lore行数超出范围")); + return; + } + loreList.remove(position - 1); + itemMeta.setLore(loreList); + itemStack.setItemMeta(itemMeta); + player.getInventory().setItemInMainHand(itemStack); + player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改")); + } + + @CmdMapping(format = "edit ") + public void editLore(@CmdSender Player player, @CmdParam("position") int position, @CmdParam("lore...") String[] lore) { + ItemStack itemStack = player.getInventory().getItemInMainHand(); + if (itemStack.getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore")); + return; + } + ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta()); + List loreList = itemMeta.getLore(); + if (loreList == null || loreList.isEmpty()) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空")); + return; + } + if (position > loreList.size() || position < 1) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("Lore行数超出范围")); + return; + } + String loreToEdit = String.join(" ", lore); + if (position == 0) { + itemMeta.setDisplayName(coloredMsg(loreToEdit)); + } else { + loreList.set(position - 1, coloredMsg(loreToEdit)); + itemMeta.setLore(loreList); + } + itemStack.setItemMeta(itemMeta); + player.getInventory().setItemInMainHand(itemStack); + player.sendMessage(ChatColor.GREEN + BasicFunctions.getInstance().i18n("物品Lore已修改")); + } + + @Override + protected List suggest(Player player, String[] strings) { + switch (strings.length) { + case 1: + return Arrays.asList( + "add", + "delete", + "edit" + ); + case 2: + case 3: + if (strings[0].equals("add")) { + return Collections.singletonList(BasicFunctions.getInstance().i18n("<内容>")); + } + ItemStack itemStack = player.getInventory().getItemInMainHand(); + if (itemStack.getType() == Material.AIR) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("请手持物品来修改Lore")); + return Collections.emptyList(); + } + ItemMeta itemMeta = Objects.requireNonNull(itemStack.getItemMeta()); + List lore = itemMeta.getLore(); + if (lore == null || lore.isEmpty()) { + player.sendMessage(ChatColor.RED + BasicFunctions.getInstance().i18n("物品Lore为空")); + return Collections.emptyList(); + } + List list = new ArrayList<>(); + for (int i = 1; i <= lore.size(); i++) { + list.add(i + ". " + lore.get(i - 1)); + } + + if ((strings[0].equals("edit") || strings[0].equals("delete")) && strings.length == 2) { + return list; + } else if (strings[0].equals("edit")) { + int position; + try { + position = Integer.parseInt(strings[1]); + } catch (NumberFormatException e) { + return Collections.singletonList(BasicFunctions.getInstance().i18n("<- 请输入对应的lore行数")); + } + if (position - 1 < lore.size() && position - 1 >= 0) { + return Collections.singletonList(lore.get(position - 1)); + } + } + break; + default: + return Collections.emptyList(); + } + return Collections.emptyList(); + } + + @Override + protected void handleHelp(CommandSender sender) { + sender.sendMessage(ChatColor.RED + "lore add <内容>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("添加Lore")); + sender.sendMessage(ChatColor.RED + "lore delete <行数>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("删除Lore")); + sender.sendMessage(ChatColor.RED + "lore edit <行数> <内容>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("编辑Lore")); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/RandomTpCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/RandomTpCommands.java index fba7d92..75bcb03 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/RandomTpCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/RandomTpCommands.java @@ -2,13 +2,16 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.ultitools.UltiTools; -import com.ultikits.ultitools.abstracts.AbstractPlayerCommandExecutor; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; @@ -18,15 +21,12 @@ import java.util.Random; import static com.ultikits.ultitools.utils.MessageUtils.info; import static com.ultikits.ultitools.utils.MessageUtils.warning; -public class RandomTpCommands extends AbstractPlayerCommandExecutor { +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"wild"}, manualRegister = true, permission = "ultikits.tools.command.wild", description = "随机传送功能") +public class RandomTpCommands extends AbstractCommendExecutor { - @Override - protected boolean onPlayerCommand(Command command, String[] strings, Player player) { - - if (!player.isOp() && !player.hasPermission("ultikits.tools.command.wild")) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return false; - } + @CmdMapping(format = "") + public void wild(@CmdSender Player player) { World.Environment environment = player.getWorld().getEnvironment(); if (environment == World.Environment.NETHER || environment == World.Environment.THE_END) { player.sendMessage(warning(BasicFunctions.getInstance().i18n("这个世界禁止使用随机传送!"))); @@ -58,12 +58,10 @@ public class RandomTpCommands extends AbstractPlayerCommandExecutor { } }.runTask(UltiTools.getInstance()); } - - return true; } @Override - protected void sendHelpMessage(CommandSender sender) { + protected void handleHelp(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("随机传送到一个安全的地方"))); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SetSpawnCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SetSpawnCommands.java new file mode 100644 index 0000000..185b3c9 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SetSpawnCommands.java @@ -0,0 +1,38 @@ +package com.ultikits.plugins.commands; + +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static com.ultikits.ultitools.utils.MessageUtils.error; +import static com.ultikits.ultitools.utils.MessageUtils.info; + +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"setspawn"}, manualRegister = true, permission = "ultikits.tools.command.setspawn", description = "重生点功能") +public class SetSpawnCommands extends AbstractCommendExecutor { + + @CmdMapping(format = "") + public void setSpawn(@CmdSender Player player) { + Location location = player.getLocation(); + World world = location.getWorld(); + if (world == null) { + player.sendMessage(error(BasicFunctions.getInstance().i18n("未找到世界!"))); + return; + } + world.setSpawnLocation(location); + player.sendMessage(info(BasicFunctions.getInstance().i18n("已重设世界重生点!"))); + } + + @Override + protected void handleHelp(CommandSender sender) { + sender.sendMessage(ChatColor.RED + "setspawn" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("设置世界重生点")); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpawnCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpawnCommands.java new file mode 100644 index 0000000..870fa34 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpawnCommands.java @@ -0,0 +1,37 @@ +package com.ultikits.plugins.commands; + +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static com.ultikits.ultitools.utils.MessageUtils.error; + +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"spawn"}, manualRegister = true, permission = "ultikits.tools.command.spawn", description = "重生点功能") +public class SpawnCommands extends AbstractCommendExecutor { + + @CmdMapping(format = "") + public void spawn(@CmdSender Player player) { + if (player.getLocation().getWorld() == null) { + player.sendMessage(error(BasicFunctions.getInstance().i18n("未找到世界!"))); + return; + } + if (player.getLocation().getWorld().getSpawnLocation().equals(new Location(player.getLocation().getWorld(), 0, 0, 0, 0, 0))) { + player.sendMessage(error(BasicFunctions.getInstance().i18n("这个世界没有重生点!"))); + return; + } + player.teleport(player.getLocation().getWorld().getSpawnLocation()); + } + + @Override + protected void handleHelp(CommandSender sender) { + sender.sendMessage(ChatColor.RED + "spawn" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("传送到世界重生点")); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpeedCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpeedCommands.java index f5e13cb..1422f3a 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpeedCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/SpeedCommands.java @@ -1,53 +1,35 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; -import com.ultikits.ultitools.abstracts.AbstractTabExecutor; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.*; import org.bukkit.ChatColor; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.List; import static com.ultikits.ultitools.utils.MessageUtils.info; -import static com.ultikits.ultitools.utils.MessageUtils.warning; -public class SpeedCommands extends AbstractTabExecutor { +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"speed"}, manualRegister = true, permission = "ultikits.tools.command.speed", description = "速度设置功能") +public class SpeedCommands extends AbstractCommendExecutor { List speeds = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"); - @Override - protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { - if (player.hasPermission("ultikits.tools.command.speed")) { - if (!speeds.contains(strings[0])) { - return false; - } - player.setWalkSpeed(Float.parseFloat(strings[0]) / 10); - player.setFlySpeed(Float.parseFloat(strings[0]) / 10); - player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("行走/飞行速度已设置为%s,默认速度为2"), strings[0])); - return true; - } - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; - } - - @Nullable - @Override - protected List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { - if (!player.hasPermission("ultikits.tools.commands.speed")) { - return null; - } - if (strings.length == 1) { - return speeds; + @CmdMapping(format = "") + public void setSpeeds(@CmdSender Player player, @CmdParam("speed") String speed) { + if (!speeds.contains(speed)) { + return; } - return null; + player.setWalkSpeed(Float.parseFloat(speed) / 10); + player.setFlySpeed(Float.parseFloat(speed) / 10); + player.sendMessage(ChatColor.YELLOW + String.format(BasicFunctions.getInstance().i18n("行走/飞行速度已设置为%s,默认速度为2"), speed)); } @Override - protected void sendHelpMessage(CommandSender sender) { + protected void handleHelp(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("/speed <0-10> 设置速度"))); } } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaCommands.java index b587398..c5f6b31 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaCommands.java @@ -2,106 +2,94 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.tasks.TpTimerTask; -import com.ultikits.ultitools.abstracts.AbstractTabExecutor; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.*; import com.ultikits.ultitools.utils.MessageUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; import static com.ultikits.ultitools.utils.MessageUtils.info; import static com.ultikits.ultitools.utils.MessageUtils.warning; +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"tpa"}, manualRegister = true, permission = "ultikits.tools.command.tpa", description = "传送请求功能") +public class TpaCommands extends AbstractCommendExecutor { -public class TpaCommands extends AbstractTabExecutor { + @CmdMapping(format = "accept") + public void acceptTpa(@CmdSender Player player) { + Player teleporter = TpTimerTask.tpTemp.get(player); + if (teleporter == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); + return; + } + TpTimerTask.tpTemp.put(player, null); + TpTimerTask.tpTimer.put(player, 0); + teleporter.teleport(player.getLocation()); + teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!"))); + } - @Override - protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { - if (!player.isOp() && !player.hasPermission("ultikits.tools.command.tpa")) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return false; + @CmdMapping(format = "reject") + public void rejectTpa(@CmdSender Player player) { + Player teleporter = TpTimerTask.tpTemp.get(player); + if (teleporter == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); + return; } - switch (strings.length) { - case 1: - switch (strings[0]) { - case "accept": - Player teleporter = TpTimerTask.tpTemp.get(player); - if (teleporter == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); - return true; - } - TpTimerTask.tpTemp.put(player, null); - TpTimerTask.tpTimer.put(player, 0); - teleporter.teleport(player.getLocation()); - teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!"))); - return true; - case "reject": - Player teleporter2 = TpTimerTask.tpTemp.get(player); - if (teleporter2 == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); - return true; - } - teleporter2.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :("))); - player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!"))); - TpTimerTask.tpTemp.put(player, null); - TpTimerTask.tpTimer.put(player, 0); - return true; - default: - Player target = Bukkit.getPlayerExact(strings[0]); - if (target == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!"))); - return true; - } - if (TpTimerTask.tpTemp.get(target) != null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!"))); - return true; - } - TpTimerTask.tpTemp.put(target, player); - TpTimerTask.tpTimer.put(target, 20); - player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求!"), target.getName()))); - target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求传送到您的位置"), player.getName()))); - TextComponent ask = Component - .text(BasicFunctions.getInstance().i18n("[同意]")) - .color(TextColor.color(0x00FF00)) - .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送"))) - .clickEvent(ClickEvent.runCommand("/tpa accept")) - .append(Component.text(" ")) - .append( - Component - .text(BasicFunctions.getInstance().i18n("[拒绝]")) - .color(TextColor.color(0xFF0000)) - .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送"))) - .clickEvent(ClickEvent.runCommand("/tpa reject")) - ); - MessageUtils.sendMessage(target, ask); - return true; - } - default: - return false; + teleporter.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :("))); + player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!"))); + TpTimerTask.tpTemp.put(player, null); + TpTimerTask.tpTimer.put(player, 0); + } + + @CmdMapping(format = "") + public void tpa(@CmdSender Player player, @CmdParam("player") String targetName) { + Player target = Bukkit.getPlayerExact(targetName); + if (target == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!"))); + return; + } + if (TpTimerTask.tpTemp.get(target) != null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!"))); + return; } + TpTimerTask.tpTemp.put(target, player); + TpTimerTask.tpTimer.put(target, 20); + player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求!"), target.getName()))); + target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求传送到您的位置"), player.getName()))); + TextComponent ask = Component + .text(BasicFunctions.getInstance().i18n("[同意]")) + .color(TextColor.color(0x00FF00)) + .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送"))) + .clickEvent(ClickEvent.runCommand("/tpa accept")) + .append(Component.text(" ")) + .append( + Component + .text(BasicFunctions.getInstance().i18n("[拒绝]")) + .color(TextColor.color(0xFF0000)) + .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送"))) + .clickEvent(ClickEvent.runCommand("/tpa reject")) + ); + MessageUtils.sendMessage(target, ask); } @Override - protected @Nullable - List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { + protected List suggest(Player player, String[] strings) { return TpaHereCommands.getTpTabList(strings); } @Override - protected void sendHelpMessage(CommandSender sender) { + protected void handleHelp(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("----传送请求帮助----"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa [玩家名] 向玩家发送传送请求"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa accept 接受传送请求"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tpa reject 拒绝传送请求"))); } - } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaHereCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaHereCommands.java index 864154d..2d8bca6 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaHereCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/TpaHereCommands.java @@ -2,14 +2,14 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.tasks.TpTimerTask; -import com.ultikits.ultitools.abstracts.AbstractTabExecutor; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.*; import com.ultikits.ultitools.utils.MessageUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.format.TextColor; import org.bukkit.Bukkit; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -22,7 +22,9 @@ import static com.ultikits.ultitools.utils.MessageUtils.info; import static com.ultikits.ultitools.utils.MessageUtils.warning; -public class TpaHereCommands extends AbstractTabExecutor { +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"tphere"}, manualRegister = true, permission = "ultikits.tools.command.tphere", description = "请求传送到此功能") +public class TpaHereCommands extends AbstractCommendExecutor { @Nullable public static List getTpTabList(@NotNull String[] strings) { List tabCommands = new ArrayList<>(); @@ -37,74 +39,70 @@ public class TpaHereCommands extends AbstractTabExecutor { return null; } - @Override - protected boolean onPlayerCommand(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { - if (!player.isOp() && !player.hasPermission("ultikits.tools.command.tphere")) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return false; + @CmdMapping(format = "accept") + public void acceptTpa(@CmdSender Player player) { + Player teleporter = TpTimerTask.tphereTemp.get(player); + if (teleporter == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); + return; } - if (strings.length == 1) { - switch (strings[0]) { - case "accept": - Player teleporter = TpTimerTask.tphereTemp.get(player); - if (teleporter == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); - return true; - } - TpTimerTask.tphereTemp.put(player, null); - TpTimerTask.tphereTimer.put(player, 0); - player.teleport(teleporter.getLocation()); - teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!"))); - return true; - case "reject": - Player teleporter2 = TpTimerTask.tphereTemp.get(player); - if (teleporter2 == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); - return true; - } - teleporter2.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :("))); - player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!"))); - TpTimerTask.tphereTemp.put(player, null); - TpTimerTask.tphereTimer.put(player, 0); - return true; - default: - Player target = Bukkit.getPlayerExact(strings[0]); - if (target == null) { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!"))); - return true; - } - TpTimerTask.tphereTemp.put(target, player); - TpTimerTask.tphereTimer.put(target, 20); - player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求!"), target.getName()))); - target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求您传送至他的位置"), player.getName()))); - TextComponent ask = Component - .text(BasicFunctions.getInstance().i18n("[同意]")) - .color(TextColor.color(0x00FF00)) - .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送"))) - .clickEvent(ClickEvent.runCommand("/tphere accept")) - .append(Component.text(" ")) - .append( - Component - .text(BasicFunctions.getInstance().i18n("[拒绝]")) - .color(TextColor.color(0xFF0000)) - .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送"))) - .clickEvent(ClickEvent.runCommand("/tphere reject")) - ); - MessageUtils.sendMessage(target, ask); - return true; - } + TpTimerTask.tphereTemp.put(player, null); + TpTimerTask.tphereTimer.put(player, 0); + player.teleport(teleporter.getLocation()); + teleporter.sendMessage(info(BasicFunctions.getInstance().i18n("传送成功!"))); + } + + @CmdMapping(format = "reject") + public void rejectTpa(@CmdSender Player player) { + Player teleporter = TpTimerTask.tphereTemp.get(player); + if (teleporter == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("并没有玩家给你发送传送请求!"))); + return; } - return false; + teleporter.sendMessage(warning(BasicFunctions.getInstance().i18n("对方拒绝了你的传送请求 :("))); + player.sendMessage(info(BasicFunctions.getInstance().i18n("已拒绝!"))); + TpTimerTask.tphereTemp.put(player, null); + TpTimerTask.tphereTimer.put(player, 0); + } + + @CmdMapping(format = "") + public void tpa(@CmdSender Player player, @CmdParam("player") String targetName) { + Player target = Bukkit.getPlayerExact(targetName); + if (target == null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("未找到目标,无法请求传送!"))); + return; + } + if (TpTimerTask.tphereTemp.get(target) != null) { + player.sendMessage(warning(BasicFunctions.getInstance().i18n("对方正在处理另一个传送请求!"))); + return; + } + TpTimerTask.tphereTemp.put(target, player); + TpTimerTask.tphereTimer.put(target, 20); + player.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("你已向%s发送TP请求!"), target.getName()))); + target.sendMessage(info(String.format(BasicFunctions.getInstance().i18n("%s请求您传送至他的位置"), player.getName()))); + TextComponent ask = Component + .text(BasicFunctions.getInstance().i18n("[同意]")) + .color(TextColor.color(0x00FF00)) + .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击同意传送"))) + .clickEvent(ClickEvent.runCommand("/tphere accept")) + .append(Component.text(" ")) + .append( + Component + .text(BasicFunctions.getInstance().i18n("[拒绝]")) + .color(TextColor.color(0xFF0000)) + .hoverEvent(Component.text(BasicFunctions.getInstance().i18n("点击拒绝传送"))) + .clickEvent(ClickEvent.runCommand("/tphere reject")) + ); + MessageUtils.sendMessage(target, ask); } - @Nullable @Override - protected List onPlayerTabComplete(@NotNull Command command, @NotNull String[] strings, @NotNull Player player) { + protected List suggest(Player player, String[] strings) { return getTpTabList(strings); } @Override - protected void sendHelpMessage(CommandSender sender) { + protected void handleHelp(CommandSender sender) { sender.sendMessage(info(BasicFunctions.getInstance().i18n("----传送至此请求帮助----"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tphere accept 接受传送请求"))); sender.sendMessage(info(BasicFunctions.getInstance().i18n("/tphere reject 拒绝传送请求"))); diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WarpCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WarpCommands.java new file mode 100644 index 0000000..b41d019 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WarpCommands.java @@ -0,0 +1,96 @@ +package com.ultikits.plugins.commands; + +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.plugins.data.WarpData; +import com.ultikits.plugins.guis.WarpGui; +import com.ultikits.plugins.services.WarpService; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.*; +import com.ultikits.ultitools.services.TeleportService; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +@CmdExecutor(alias = {"warp"}, manualRegister = true, permission = "ultikits.tools.command.warp", description = "传送点功能") +public class WarpCommands extends AbstractCommendExecutor { + @Autowired + private WarpService warpService; + + @CmdMapping(format = "list") + public void listWarps(@CmdSender Player player) { + WarpGui warpGui = new WarpGui(player); + warpGui.open(); + } + + @CmdMapping(format = "tp ") + public void tpWarp(@CmdSender Player player, @CmdParam("name") String name) { + Location warpLocation = warpService.getWarpLocation(name); + player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已传送至传送点 %s"), name)); + TeleportService teleportService = BasicFunctions.getInstance().getContext().getBean(TeleportService.class); + teleportService.delayTeleport(player, warpLocation, 3); + } + + @CmdMapping(format = "add ", requireOp = true) + public void addWarp(@CmdSender Player player, @CmdParam("name") String name) { + warpService.addWarp(name, player.getLocation()); + player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已添加传送点 %s"), name)); + } + + @CmdMapping(format = "remove ", requireOp = true) + public void removeWarp(@CmdSender Player player, @CmdParam("name") String name) { + warpService.removeWarp(name); + player.sendMessage(String.format(BasicFunctions.getInstance().i18n("§a已删除传送点 %s"), name)); + } + + @Override + protected List suggest(Player player, String[] strings) { + ArrayList list = new ArrayList<>(); + switch (strings.length) { + case 1: + list.add("list"); + list.add("tp"); + if (player.isOp()) { + list.add("add"); + list.add("remove"); + } + return list; + case 2: + switch (strings[0]) { + case "remove": + if (player.isOp()) { + List allWarps = warpService.getAllWarps(); + for (WarpData warpData : allWarps) { + list.add(warpData.getName()); + } + return list; + } + return list; + case "tp": + List allWarps = warpService.getAllWarps(); + for (WarpData warpData : allWarps) { + list.add(warpData.getName()); + } + return list; + default: + return list; + } + default: + return list; + } + } + + @Override + protected void handleHelp(CommandSender sender) { + sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp list §7- §e查看所有传送点")); + sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp tp §7- §e传送至传送点")); + if (sender.isOp()) { + sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp add §7- §e添加传送点")); + sender.sendMessage(BasicFunctions.getInstance().i18n("§a/warp remove §7- §e删除传送点")); + } + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WhitelistCommands.java b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WhitelistCommands.java index f2637b6..d5780d4 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WhitelistCommands.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/commands/WhitelistCommands.java @@ -3,39 +3,29 @@ package com.ultikits.plugins.commands; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.data.WhiteListData; import com.ultikits.plugins.services.WhiteListService; +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.CmdExecutor; +import com.ultikits.ultitools.annotations.command.CmdMapping; +import com.ultikits.ultitools.annotations.command.CmdSender; +import com.ultikits.ultitools.annotations.command.CmdTarget; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; -import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.List; -import static com.ultikits.ultitools.utils.MessageUtils.warning; - -public class WhitelistCommands implements TabExecutor { - private final WhiteListService whiteListService = new WhiteListService(); +@CmdTarget(CmdTarget.CmdTargetType.BOTH) +@CmdExecutor(alias = {"wl"}, manualRegister = true, permission = "ultikits.tools.command.whitelist", description = "白名单功能") +public class WhitelistCommands extends AbstractCommendExecutor { + @Autowired + private WhiteListService whiteListService; @Override - public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) { - if (sender instanceof Player) { - Player player = (Player) sender; - if (player.hasPermission("ultikits.tools.admin") || player.hasPermission("ultikits.tools.whitelist")) { - return whiteListCommands(sender, command, args); - } else { - player.sendMessage(warning(BasicFunctions.getInstance().i18n("你没有权限使用此指令!"))); - return true; - } - } else { - return whiteListCommands(sender, command, args); - } - } - - private void sendHelpMessage(CommandSender sender) { + protected void handleHelp(CommandSender sender) { sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("----白名单系统帮助----")); sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl help 白名单帮助")); sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl list 白名单列表")); @@ -43,56 +33,48 @@ public class WhitelistCommands implements TabExecutor { sender.sendMessage(ChatColor.AQUA + BasicFunctions.getInstance().i18n("/wl remove [玩家名] 将玩家移出白名单")); } - private boolean whiteListCommands(CommandSender sender, Command command, String[] args) { - if ("wl".equalsIgnoreCase(command.getName())) { - if (args.length == 1) { - switch (args[0]) { - case "help": - sendHelpMessage(sender); - return true; - case "list": - List whitelist = whiteListService.getAllWhiteList(); - sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("白名单列表有:")); - for (WhiteListData each : whitelist) { - sender.sendMessage(String.format("- %s", each.getName())); - } - return true; - default: - return false; - } - } else if (args.length == 2) { - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(args[1]); - if ("add".equalsIgnoreCase(args[0])) { - whiteListService.addWhiteList(String.valueOf(offlinePlayer.getUniqueId()), args[1]); - sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s加入白名单!"), args[1])); - return true; - } else if ("remove".equalsIgnoreCase(args[0])) { - whiteListService.removeWhiteList(String.valueOf(offlinePlayer.getUniqueId())); - sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s移出白名单!"), args[1])); - return true; - } - } + @CmdMapping(format = "help", requireOp = true) + public void help(@CmdSender CommandSender sender) { + handleHelp(sender); + } + + @CmdMapping(format = "list", requireOp = true) + public void list(@CmdSender CommandSender sender) { + List whitelist = whiteListService.getAllWhiteList(); + sender.sendMessage(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("白名单列表有:")); + for (WhiteListData each : whitelist) { + sender.sendMessage(String.format("- %s", each.getName())); } - return false; + } + + @CmdMapping(format = "add ", requireOp = true) + public void add(@CmdSender CommandSender sender, String name) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name); + whiteListService.addWhiteList(String.valueOf(offlinePlayer.getUniqueId()), name); + sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s加入白名单!"), name)); + } + + @CmdMapping(format = "remove ", requireOp = true) + public void remove(@CmdSender CommandSender sender, String name) { + OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(name); + whiteListService.removeWhiteList(String.valueOf(offlinePlayer.getUniqueId())); + sender.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("已将%s移出白名单!"), name)); } @Override - public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) { - if (sender instanceof Player) { - Player player = (Player) sender; - if (player.isOp() || player.hasPermission("ultikits.tools.whitelist")) { - if (args.length == 1) { - List tabCommands = new ArrayList<>(); - tabCommands.add("help"); - tabCommands.add("list"); - tabCommands.add("add"); - tabCommands.add("remove"); - return tabCommands; - } else if (args.length == 2) { - List tabCommands = new ArrayList<>(); - tabCommands.add(BasicFunctions.getInstance().i18n("[玩家名]")); - return tabCommands; - } + protected List suggest(Player player, String[] strings) { + if (player.isOp() || player.hasPermission("ultikits.tools.whitelist")) { + if (strings.length == 1) { + List tabCommands = new ArrayList<>(); + tabCommands.add("help"); + tabCommands.add("list"); + tabCommands.add("add"); + tabCommands.add("remove"); + return tabCommands; + } else if (strings.length == 2) { + List tabCommands = new ArrayList<>(); + tabCommands.add(BasicFunctions.getInstance().i18n("[玩家名]")); + return tabCommands; } } return null; diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/config/BasicConfig.java b/BasicFunctions/src/main/java/com/ultikits/plugins/config/BasicConfig.java index 322cea3..74ccc8e 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/config/BasicConfig.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/config/BasicConfig.java @@ -30,6 +30,18 @@ public class BasicConfig extends AbstractConfigEntity { private boolean enableSpeed = true; @ConfigEntry(path = "enableBan", comment = "是否启用封禁") private boolean enableBan = true; + @ConfigEntry(path = "enableBan", comment = "是否启用传送点") + private boolean enableWarp = true; + @ConfigEntry(path = "enableSpawn", comment = "是否启用重生点设置") + private boolean enableSpawn = true; + @ConfigEntry(path = "enableLoreEditor", comment = "是否启用Lore编辑器") + private boolean enableLoreEditor = true; + @ConfigEntry(path = "enableHide", comment = "是否启用隐身功能") + private boolean enableHide = true; + @ConfigEntry(path = "enableTitle", comment = "是否启用头顶显示功能") + private boolean enableTitle = true; + @ConfigEntry(path = "enableDeathPunishment", comment = "是否启用死亡惩罚功能") + private boolean enableDeathPunishment = true; public BasicConfig(String configFilePath) { super(configFilePath); diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/config/DeathPunishmentConfig.java b/BasicFunctions/src/main/java/com/ultikits/plugins/config/DeathPunishmentConfig.java new file mode 100644 index 0000000..24f3254 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/config/DeathPunishmentConfig.java @@ -0,0 +1,41 @@ +package com.ultikits.plugins.config; + +import com.ultikits.ultitools.abstracts.AbstractConfigEntity; +import com.ultikits.ultitools.annotations.ConfigEntity; +import com.ultikits.ultitools.annotations.ConfigEntry; +import lombok.Getter; +import lombok.Setter; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +@Getter +@Setter +@ConfigEntity("config/death.yml") +public class DeathPunishmentConfig extends AbstractConfigEntity { + @ConfigEntry(path = "enable_item_drop", comment = "是否开启物品掉落") + private boolean enableItemDrop = false; + @ConfigEntry(path = "enable_money_drop", comment = "是否开启金币掉落") + private boolean enableMoneyDrop = true; + @ConfigEntry(path = "enable_punish_commands", comment = "是否开启死亡执行后台命令") + private boolean enablePunishCommands = true; + @ConfigEntry(path = "money_dropped_ondeath", comment = "死亡后掉落的金币数") + private int moneyDropOnDeath = 100; + @ConfigEntry(path = "item_dropped_ondeath", comment = "死亡后随机掉落的物品数") + private int itemDropOnDeath = 3; + @ConfigEntry(path = "punish_commands", comment = "死亡后后台执行的指令({PLAYER}指代玩家名占位符)") + private List punishCommands = Collections.emptyList(); + @ConfigEntry(path = "worlds_enabled_item_drop", comment = "开启死亡随机物品掉落的世界") + private List worldEnabledItemDrop = Arrays.asList("world", "world_nether", "world_the_end"); + @ConfigEntry(path = "worlds_enabled_money_drop", comment = "开启死亡后金币掉落的世界") + private List worldEnabledMoneyDrop = Arrays.asList("world", "world_nether", "world_the_end"); + @ConfigEntry(path = "worlds_enabled_punish_commands", comment = "开启死亡后执行后台指令的世界") + private List worldEnabledPunishCommands = Arrays.asList("world", "world_nether", "world_the_end"); + @ConfigEntry(path = "item_drop_whitelist", comment = "物品掉落白名单") + private List itemDropWhiteList = Collections.emptyList(); + + public DeathPunishmentConfig(String configFilePath) { + super(configFilePath); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/config/PlayerNameTagConfig.java b/BasicFunctions/src/main/java/com/ultikits/plugins/config/PlayerNameTagConfig.java new file mode 100644 index 0000000..4183ec2 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/config/PlayerNameTagConfig.java @@ -0,0 +1,25 @@ +package com.ultikits.plugins.config; + +import com.ultikits.ultitools.abstracts.AbstractConfigEntity; +import com.ultikits.ultitools.annotations.ConfigEntity; +import com.ultikits.ultitools.annotations.ConfigEntry; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@ConfigEntity("config/title.yml") +public class PlayerNameTagConfig extends AbstractConfigEntity { + @ConfigEntry(path = "prefix", comment = "玩家名字前缀") + private String prefix = "&e[&dLv.%player_level%&e]"; + @ConfigEntry(path = "suffix", comment = "玩家名字后缀") + private String suffix = "&e[&a%player_health_rounded%&e/&a%player_max_health_rounded%&e]"; + @ConfigEntry(path = "updateInterval", comment = "更新间隔") + private int updateInterval = 20; + @ConfigEntry(path = "enableNameTagEdit", comment = "是否启用NameTagEdit支持") + private boolean enableNameTagEdit = false; + + public PlayerNameTagConfig(String configFilePath) { + super(configFilePath); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/config/WarpConfig.java b/BasicFunctions/src/main/java/com/ultikits/plugins/config/WarpConfig.java new file mode 100644 index 0000000..16458bf --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/config/WarpConfig.java @@ -0,0 +1,23 @@ +package com.ultikits.plugins.config; + +import com.ultikits.ultitools.abstracts.AbstractConfigEntity; +import com.ultikits.ultitools.annotations.ConfigEntity; +import com.ultikits.ultitools.annotations.ConfigEntry; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@ConfigEntity("config/warp.yml") +public class WarpConfig extends AbstractConfigEntity { + @ConfigEntry(path = "enable_blue_map", comment = "是否启用BlueMap") + private boolean enableBlueMap = false; + @ConfigEntry(path = "blue_map_warp_max_distance", comment = "传送点在BlueMap中最远显示距离") + private int maxDistance = 1000; + @ConfigEntry(path = "blue_map_marker_set", comment = "传送点在BlueMap中的标记集名称") + private String markerSet = "UltiTools Warps"; + + public WarpConfig(String configFilePath) { + super(configFilePath); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/data/WarpData.java b/BasicFunctions/src/main/java/com/ultikits/plugins/data/WarpData.java new file mode 100644 index 0000000..e8dc2f8 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/data/WarpData.java @@ -0,0 +1,23 @@ +package com.ultikits.plugins.data; + +import com.ultikits.ultitools.abstracts.AbstractDataEntity; +import com.ultikits.ultitools.annotations.Column; +import com.ultikits.ultitools.annotations.Table; +import com.ultikits.ultitools.entities.common.WorldLocation; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.bukkit.Location; + +import java.util.Date; + +@Data +@Table("warp_table") +@EqualsAndHashCode(callSuper = true) +public class WarpData extends AbstractDataEntity { + @Column("id") + private Long id = new Date().getTime(); + @Column("name") + private String name; + @Column("location") + private WorldLocation location; +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/data/WhiteListData.java b/BasicFunctions/src/main/java/com/ultikits/plugins/data/WhiteListData.java index b57d382..4c98f7c 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/data/WhiteListData.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/data/WhiteListData.java @@ -14,4 +14,6 @@ public class WhiteListData extends AbstractDataEntity { private String id; @Column("name") private String name; + @Column("remark") + private String remark; } diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/guis/WarpGui.java b/BasicFunctions/src/main/java/com/ultikits/plugins/guis/WarpGui.java new file mode 100644 index 0000000..a1fe765 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/guis/WarpGui.java @@ -0,0 +1,52 @@ +package com.ultikits.plugins.guis; + +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.plugins.data.WarpData; +import com.ultikits.plugins.services.WarpService; +import com.ultikits.ultitools.UltiTools; +import com.ultikits.ultitools.abstracts.guis.PagingPage; +import mc.obliviate.inventory.Icon; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class WarpGui extends PagingPage { + private final WarpService warpService = new WarpService(); + + public WarpGui(Player player) { + super( + player, + "Warp-list", + Component.text(BasicFunctions.getInstance().i18n("传送点列表")) + .color(TextColor.color(0xFF00A6)), + 3 + ); + } + + @Override + public List setAllItems() { + List icons = new ArrayList<>(); + List allWarps = warpService.getAllWarps(); + for (WarpData warpData : allWarps) { + Location location = WarpService.toLocation(warpData.getLocation()); + Icon icon = new Icon(UltiTools.getInstance().getVersionWrapper().getEndEye()); + TextComponent textComponent = Component.text(warpData.getName()).color(TextColor.color(0xFF00A6)); + icon.toComp().setName(textComponent); + String world = String.format(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("所在世界 %s"), location.getWorld().getName()); + String xyz = String.format(ChatColor.GRAY + "X: %.2f Y: %.2f Z: %.2f", location.getX(), location.getY(), location.getZ()); + icon.setLore(world, xyz); + icon.onClick((e) -> { + player.performCommand("warp tp " + warpData.getName()); + player.closeInventory(); + }); + icons.add(icon); + } + return icons; + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BackListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BackListener.java index 5aeb3ef..9bbc817 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BackListener.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BackListener.java @@ -1,5 +1,6 @@ package com.ultikits.plugins.listeners; +import com.ultikits.ultitools.annotations.EventListener; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -10,6 +11,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; +@EventListener(manualRegister = true) public class BackListener implements Listener { private static final Map playerDeathLocation = new HashMap<>(); diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BanListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BanListener.java index 0b748a3..2e8254b 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BanListener.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/BanListener.java @@ -1,12 +1,16 @@ package com.ultikits.plugins.listeners; import com.ultikits.plugins.services.BanPlayerService; +import com.ultikits.ultitools.annotations.EventListener; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import org.springframework.beans.factory.annotation.Autowired; +@EventListener(manualRegister = true) public class BanListener implements Listener { - private BanPlayerService banPlayerService = new BanPlayerService(); + @Autowired + private BanPlayerService banPlayerService; @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/DeathListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/DeathListener.java new file mode 100644 index 0000000..253d4d1 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/DeathListener.java @@ -0,0 +1,45 @@ +package com.ultikits.plugins.listeners; + +import com.ultikits.plugins.tasks.DeathPunishmentTask; +import com.ultikits.ultitools.annotations.EventListener; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author qianmo, wisdomme + */ +@EventListener(manualRegister = true) +public class DeathListener implements Listener { + private static final List list = new ArrayList<>(); + @Autowired + private DeathPunishmentTask deathPunishmentTask; + + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + Player player = event.getEntity(); + if (list.contains(player)) { + list.remove(player); + deathPunishmentTask.addPlayerToQueue(player); + } + } + + @EventHandler + public void onEntityDamage(EntityDamageEvent event) { + if (!(event.getEntity() instanceof Player)) { + return; + } + Player player = (Player) event.getEntity(); + + if (player.getHealth() > event.getFinalDamage()) { + return; + } + list.add(player); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/HideListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/HideListener.java new file mode 100644 index 0000000..c2c2c33 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/HideListener.java @@ -0,0 +1,15 @@ +package com.ultikits.plugins.listeners; + +import com.ultikits.plugins.commands.HideCommands; +import com.ultikits.ultitools.annotations.EventListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +@EventListener(manualRegister = true) +public class HideListener implements Listener { + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + HideCommands.removeHidePlayer(event.getPlayer().getUniqueId()); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/JoinWelcomeListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/JoinWelcomeListener.java index 66ad6af..687301e 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/JoinWelcomeListener.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/JoinWelcomeListener.java @@ -3,6 +3,7 @@ package com.ultikits.plugins.listeners; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.config.JoinWelcomeConfig; import com.ultikits.ultitools.UltiTools; +import com.ultikits.ultitools.annotations.EventListener; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -14,6 +15,7 @@ import org.bukkit.scheduler.BukkitRunnable; import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; +@EventListener(manualRegister = true) public class JoinWelcomeListener implements Listener { @EventHandler diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/PlayerNameTagListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/PlayerNameTagListener.java new file mode 100644 index 0000000..862078a --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/PlayerNameTagListener.java @@ -0,0 +1,32 @@ +package com.ultikits.plugins.listeners; + +import com.nametagedit.plugin.NametagEdit; +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.plugins.config.PlayerNameTagConfig; +import com.ultikits.plugins.utils.TitlesUtils; +import com.ultikits.ultitools.annotations.EventListener; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; + +@EventListener(manualRegister = true) +public class PlayerNameTagListener implements Listener { + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + PlayerNameTagConfig nameTagConfig = BasicFunctions.getInstance().getConfig(PlayerNameTagConfig.class); + String prefix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getPrefix())); + String suffix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getSuffix())); + if (nameTagConfig.isEnableNameTagEdit()) { + NametagEdit.getApi().updatePlayerNametag(player.getName(), prefix, suffix); + } else { + TitlesUtils.setPrefixSuffix(player, prefix, suffix); + } + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/WhitelistListener.java b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/WhitelistListener.java index 154449a..bfd2e4a 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/WhitelistListener.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/listeners/WhitelistListener.java @@ -2,14 +2,18 @@ package com.ultikits.plugins.listeners; import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.services.WhiteListService; +import com.ultikits.ultitools.annotations.EventListener; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerLoginEvent; +import org.springframework.beans.factory.annotation.Autowired; +@EventListener(manualRegister = true) public class WhitelistListener implements Listener { - private final WhiteListService whiteListService = new WhiteListService(); + @Autowired + private WhiteListService whiteListService; @EventHandler public void onPlayerLogin(PlayerLoginEvent event) { diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/services/DeathPunishService.java b/BasicFunctions/src/main/java/com/ultikits/plugins/services/DeathPunishService.java new file mode 100644 index 0000000..938606b --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/services/DeathPunishService.java @@ -0,0 +1,55 @@ +package com.ultikits.plugins.services; + +import com.ultikits.ultitools.UltiTools; +import net.milkbowl.vault.economy.Economy; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author qianmo, wisdomme + */ +@Service +public class DeathPunishService { + public void takeMoney(Player player, int money) { + Economy economy = UltiTools.getInstance().getEconomy(); + economy.withdrawPlayer(player, Math.min(economy.getBalance(player), money)); + } + + public void execCommand(List cmd, String playerName) { + for (String s : cmd) { + Bukkit.getServer().dispatchCommand( + Bukkit.getServer().getConsoleSender(), s.replace("{PLAYER}", playerName) + ); + } + } + + public void takeItem(Player player, int drop, List whitelist) { + Inventory inventory = player.getInventory(); + List inventorySlot = new ArrayList<>(); + for (int i = 0; i < 45; i++) { + ItemStack item = inventory.getItem(i); + if (item != null && !whitelist.contains(item.getType().toString())) { + inventorySlot.add(i); + } + } + Collections.shuffle(inventorySlot); + List ints = new ArrayList<>(); + for (int i = 0; i < drop; i++) { + if (i >= inventorySlot.size()) break; + ints.add(inventorySlot.get(i)); + } + for (Integer slot : ints) { + ItemStack itemStack = inventory.getItem(slot); + if (itemStack == null) continue; + itemStack.setAmount(itemStack.getAmount() - 1); + inventory.setItem(slot, itemStack); + } + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/services/WarpService.java b/BasicFunctions/src/main/java/com/ultikits/plugins/services/WarpService.java new file mode 100644 index 0000000..d6dda08 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/services/WarpService.java @@ -0,0 +1,117 @@ +package com.ultikits.plugins.services; + +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.plugins.config.WarpConfig; +import com.ultikits.plugins.data.WarpData; +import com.ultikits.ultitools.entities.WhereCondition; +import com.ultikits.ultitools.entities.common.WorldLocation; +import de.bluecolored.bluemap.api.BlueMapAPI; +import de.bluecolored.bluemap.api.BlueMapMap; +import de.bluecolored.bluemap.api.markers.MarkerSet; +import de.bluecolored.bluemap.api.markers.POIMarker; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.springframework.stereotype.Service; + +import java.util.List; + +import static com.ultikits.ultitools.abstracts.UltiToolsPlugin.getConfigManager; + +@Service +public class WarpService { + + public static Location toLocation(WorldLocation worldLocation) { + return new Location(Bukkit.getWorld(worldLocation.getWorld()), worldLocation.getX(), worldLocation.getY(), worldLocation.getZ(), worldLocation.getYaw(), worldLocation.getPitch()); + } + + public void addWarp(String name, Location location) { + WarpData warpData = new WarpData(); + warpData.setName(name); + WorldLocation worldLocation = new WorldLocation(location); + warpData.setLocation(worldLocation); + BasicFunctions.getInstance().getDataOperator(WarpData.class).insert(warpData); + addWarpToBlueMap(warpData); + } + + public void removeWarp(String name) { + List warpData = BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll( + WhereCondition.builder().column("name").value(name).build() + ); + if (warpData.isEmpty()) { + return; + } + BasicFunctions.getInstance().getDataOperator(WarpData.class).del( + WhereCondition.builder().column("name").value(name).build() + ); + removeWarpFromBlueMap(warpData.get(0)); + } + + public Location getWarpLocation(String name) { + List warpData = BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll( + WhereCondition.builder().column("name").value(name).build() + ); + if (warpData.isEmpty()) { + return null; + } + return toLocation(warpData.get(0).getLocation()); + } + + public List getAllWarps() { + return BasicFunctions.getInstance().getDataOperator(WarpData.class).getAll(); + } + + public void initBlueMap(){ + WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class); + if (!warpConfig.isEnableBlueMap()) { + return; + } + BlueMapAPI.getInstance().ifPresent(api -> { + api.getWorlds().forEach(world -> { + for (BlueMapMap map : world.getMaps()) { + MarkerSet markerSet = MarkerSet.builder() + .label(warpConfig.getMarkerSet()) + .build(); + map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet); + } + }); + }); + for (WarpData warpData : getAllWarps()) { + addWarpToBlueMap(warpData); + } + } + + public void addWarpToBlueMap(WarpData warpData) { + WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class); + if (!warpConfig.isEnableBlueMap()) { + return; + } + WorldLocation location = warpData.getLocation(); + POIMarker marker = POIMarker.builder() + .label(warpData.getName()) + .position(location.getX(), location.getY(), location.getZ()) + .maxDistance(warpConfig.getMaxDistance()) + .build(); + + BlueMapAPI.getInstance().flatMap(api -> api.getWorld(location.getWorld())).ifPresent(world -> { + for (BlueMapMap map : world.getMaps()) { + MarkerSet markerSet = map.getMarkerSets().get(warpConfig.getMarkerSet()); + markerSet.getMarkers().put(String.valueOf(warpData.getId()), marker); + map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet); + } + }); + } + + public void removeWarpFromBlueMap(WarpData warpData) { + WarpConfig warpConfig = getConfigManager().getConfigEntity(BasicFunctions.getInstance(), WarpConfig.class); + if (!warpConfig.isEnableBlueMap()) { + return; + } + BlueMapAPI.getInstance().flatMap(api -> api.getWorld(warpData.getLocation().getWorld())).ifPresent(world -> { + for (BlueMapMap map : world.getMaps()) { + MarkerSet markerSet = map.getMarkerSets().get(warpConfig.getMarkerSet()); + markerSet.remove(String.valueOf(warpData.getId())); +// map.getMarkerSets().put(warpConfig.getMarkerSet(), markerSet); + } + }); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/services/WhiteListService.java b/BasicFunctions/src/main/java/com/ultikits/plugins/services/WhiteListService.java index 0094b44..52d383f 100644 --- a/BasicFunctions/src/main/java/com/ultikits/plugins/services/WhiteListService.java +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/services/WhiteListService.java @@ -4,9 +4,11 @@ import com.ultikits.plugins.BasicFunctions; import com.ultikits.plugins.data.WhiteListData; import com.ultikits.ultitools.entities.WhereCondition; import com.ultikits.ultitools.interfaces.DataOperator; +import org.springframework.stereotype.Service; import java.util.List; +@Service public class WhiteListService { public boolean isWhiteList(String uuid) { diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/DeathPunishmentTask.java b/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/DeathPunishmentTask.java new file mode 100644 index 0000000..985ecee --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/DeathPunishmentTask.java @@ -0,0 +1,87 @@ +package com.ultikits.plugins.tasks; + +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.plugins.config.DeathPunishmentConfig; +import com.ultikits.plugins.services.DeathPunishService; +import com.ultikits.ultitools.UltiTools; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; + +import java.util.*; + +@Service +public class DeathPunishmentTask { + protected List punishQueue = new ArrayList<>(); + @Autowired + private DeathPunishService deathPunishService; + + public DeathPunishmentTask() { + DeathPunishmentConfig deathPunishmentConfig = UltiTools.getInstance().getConfigManager().getConfigEntity(BasicFunctions.getInstance(), DeathPunishmentConfig.class); + new BukkitRunnable() { + @Override + public void run() { + Iterator iterator = punishQueue.iterator(); + while (iterator.hasNext()) { + UUID uuid; + try { + uuid = iterator.next(); + } catch (ConcurrentModificationException e) { + continue; + } + Player player = Bukkit.getPlayer(uuid); + if (player == null) { + continue; + } + String world = player.getWorld().getName(); + List list; + if (deathPunishmentConfig.isEnableItemDrop()) { + list = deathPunishmentConfig.getWorldEnabledItemDrop(); + for (String s : list) { + if (s.equals(world)) { + int itemDropOnDeath = deathPunishmentConfig.getItemDropOnDeath(); + deathPunishService.takeItem(player, itemDropOnDeath, deathPunishmentConfig.getItemDropWhiteList()); + player.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("[死亡惩罚]你因为死亡随机掉落了%d个物品!"), itemDropOnDeath)); + } + } + } + + if (deathPunishmentConfig.isEnableMoneyDrop()) { + list = deathPunishmentConfig.getWorldEnabledMoneyDrop(); + for (String s : list) { + if (s.equals(world)) { + int moneyDropOnDeath = deathPunishmentConfig.getMoneyDropOnDeath(); + deathPunishService.takeMoney(player, moneyDropOnDeath); + player.sendMessage(ChatColor.RED + String.format(BasicFunctions.getInstance().i18n("[死亡惩罚]你因为死亡而扣除了%d个金币!"), moneyDropOnDeath)); + } + } + } + + if (deathPunishmentConfig.isEnablePunishCommands()) { + list = deathPunishmentConfig.getWorldEnabledPunishCommands(); + for (String s : list) { + if (s.equals(world)) { + UltiTools.getInstance().getServer().getScheduler().callSyncMethod(UltiTools.getInstance(), () -> { + deathPunishService.execCommand(deathPunishmentConfig.getPunishCommands(), player.getName()); + return null; + }); + } + } + } + punishQueue.remove(uuid); + } + } + }.runTaskTimerAsynchronously(UltiTools.getInstance(), 0, 20); + } + + public void addPlayerToQueue(Player player) { + if (punishQueue.contains(player.getUniqueId())) { + return; + } + punishQueue.add(player.getUniqueId()); + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/NamePrefixSuffixTask.java b/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/NamePrefixSuffixTask.java new file mode 100644 index 0000000..a131187 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/tasks/NamePrefixSuffixTask.java @@ -0,0 +1,30 @@ +package com.ultikits.plugins.tasks; + +import com.nametagedit.plugin.NametagEdit; +import com.ultikits.plugins.BasicFunctions; +import com.ultikits.plugins.config.PlayerNameTagConfig; +import com.ultikits.plugins.utils.TitlesUtils; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; + +public class NamePrefixSuffixTask extends BukkitRunnable { + + @Override + public void run() { + PlayerNameTagConfig nameTagConfig = BasicFunctions.getInstance().getConfig(PlayerNameTagConfig.class); + for (Player player : Bukkit.getOnlinePlayers()) { + String prefix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getPrefix())); + String suffix = coloredMsg(PlaceholderAPI.setPlaceholders(player, nameTagConfig.getSuffix())); + if (nameTagConfig.isEnableNameTagEdit()){ + NametagEdit.getApi().updatePlayerNametag(player.getName(), prefix, suffix); + }else { + TitlesUtils.setPrefixSuffix(player, prefix, suffix); + } + } + } +} diff --git a/BasicFunctions/src/main/java/com/ultikits/plugins/utils/TitlesUtils.java b/BasicFunctions/src/main/java/com/ultikits/plugins/utils/TitlesUtils.java new file mode 100644 index 0000000..373d827 --- /dev/null +++ b/BasicFunctions/src/main/java/com/ultikits/plugins/utils/TitlesUtils.java @@ -0,0 +1,49 @@ +package com.ultikits.plugins.utils; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +public class TitlesUtils { + + public static void setPrefixSuffix(Player player, String prefix, String suffix) { + for (Player online : Bukkit.getOnlinePlayers()) { + if (!online.canSee(player)) { + continue; + } + Scoreboard scoreboard = online.getScoreboard(); + if (scoreboard == Bukkit.getScoreboardManager().getMainScoreboard()) { + scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); + } + Team team = scoreboard.getTeam(player.getName()); + if (team == null) { + team = scoreboard.registerNewTeam(player.getName()); + } + team.setPrefix(prefix); + team.setSuffix(suffix); + team.addEntry(player.getName()); + online.setScoreboard(scoreboard); + } + for (Player online : Bukkit.getOnlinePlayers()) { + if (!online.canSee(player)) { + continue; + } + if (online.getUniqueId().equals(player.getUniqueId())) + continue; + Scoreboard scoreboard = player.getScoreboard(); + if (scoreboard == Bukkit.getScoreboardManager().getMainScoreboard()) { + scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); + } + Team team = scoreboard.getTeam(online.getName()); + if (team == null) { + team = scoreboard.registerNewTeam(online.getName()); + } + + team.setPrefix(player.getScoreboard().getTeam(online.getName()).getPrefix()); + team.setSuffix(player.getScoreboard().getTeam(online.getName()).getSuffix()); + team.addEntry(online.getName()); + player.setScoreboard(scoreboard); + } + } +} diff --git a/BasicFunctions/src/main/resources/config/config.yml b/BasicFunctions/src/main/resources/config/config.yml index 004f480..598be9b 100644 --- a/BasicFunctions/src/main/resources/config/config.yml +++ b/BasicFunctions/src/main/resources/config/config.yml @@ -18,3 +18,15 @@ enableTpa: true enableSpeed: true # 是否启用封禁功能 enableBan: true +# 是否启用封禁功能 +enableWarp: true +# 是否启用重生点设置 +enableSpawn: true +# 是否启用Lore编辑器 +enableLoreEditor: true +# 是否启用隐身功能 +enableHide: true +# 是否启用玩家头顶显示功能 +enableTitle: true +# 是否启用死亡惩罚功能 +enableDeathPunishment: true diff --git a/BasicFunctions/src/main/resources/config/death.yml b/BasicFunctions/src/main/resources/config/death.yml new file mode 100644 index 0000000..3f3bf2c --- /dev/null +++ b/BasicFunctions/src/main/resources/config/death.yml @@ -0,0 +1,38 @@ +# 是否开启物品掉落 +enable_item_drop: false + +# 是否开启金币掉落 +enable_money_drop: true + +# 是否开启死亡执行后台命令 +enable_punish_commands: true + +# 死亡后掉落的金币数 +money_dropped_ondeath: 100 + +# 死亡后随机掉落的物品数 +item_dropped_ondeath: 3 + +# 死亡后后台执行的指令({PLAYER}指代玩家名占位符) +punish_commands: [] + +# 开启死亡随机物品掉落的世界 +worlds_enabled_item_drop: + - world + - world_nether + - world_the_end + +# 开启死亡后金币掉落的世界 +worlds_enabled_money_drop: + - world + - world_nether + - world_the_end + +# 开启死亡后执行后台指令的世界 +worlds_enabled_punish_commands: + - world + - world_nether + - world_the_end + +# 物品掉落白名单 +item_drop_whitelist: [] diff --git a/BasicFunctions/src/main/resources/config/title.yml b/BasicFunctions/src/main/resources/config/title.yml new file mode 100644 index 0000000..32ab018 --- /dev/null +++ b/BasicFunctions/src/main/resources/config/title.yml @@ -0,0 +1,8 @@ +# 玩家名前缀 +prefix: "&e[&dLv.%player_level%&e]" +# 玩家名后缀 +suffix: "&e[&a%player_health_rounded%&e/&a%player_max_health_rounded%&e]" +# 玩家头顶显示更新间隔(单位:tick,一般20代表1秒) +updateInterval: 20 +# 是否启用Nametagedit插件支持 +enableNameTagEdit: false diff --git a/BasicFunctions/src/main/resources/config/warp.yml b/BasicFunctions/src/main/resources/config/warp.yml new file mode 100644 index 0000000..65a5476 --- /dev/null +++ b/BasicFunctions/src/main/resources/config/warp.yml @@ -0,0 +1,6 @@ +# 是否启用BlueMap,自行安装BlueMap插件 +enable_blue_map: false +# 传送点在BlueMap中最远显示距离 +blue_map_warp_max_distance: 1000 +# 传送点在BlueMap中的标记集名称 +blue_map_marker_set: "UltiTools Warps" diff --git a/BasicFunctions/src/main/resources/lang/en.json b/BasicFunctions/src/main/resources/lang/en.json index 98f9f44..8baf27e 100644 --- a/BasicFunctions/src/main/resources/lang/en.json +++ b/BasicFunctions/src/main/resources/lang/en.json @@ -57,5 +57,38 @@ "速度设置功能": "Speed setting function", "你已被封禁! 原因: %s": "You have been banned! Reason: %s", "§a封禁成功!": "§aBanned successfully!", - "§a解封成功!": "§aUnbanned successfully!" + "§a解封成功!": "§aUnbanned successfully!", + "传送点功能": "Teleport point function", + "§a已添加传送点 %s": "§aTeleport point %s has been added", + "§a已删除传送点 %s": "§aTeleport point %s has been deleted", + "§a/warp list §7- §e查看所有传送点": "§a/warp list §7- §eView all teleport points", + "§a/warp tp §7- §e传送至传送点": "§a/warp tp §7- §eTeleport to teleport point", + "§a/warp add §7- §e添加传送点": "§a/warp add §7- §eAdd teleport point", + "§a/warp remove §7- §e删除传送点": "§a/warp remove §7- §eDelete teleport point", + "所在世界 %s": "World: %s", + "传送点列表": "Teleport point list", + "未找到世界!": "World not found!", + "这个世界没有重生点!": "This world has no respawn point!", + "已重设世界重生点!": "World respawn point has been reset!", + "传送到世界重生点": "Teleport to world respawn point", + "重生点功能": "Spawn point function", + "设置世界重生点": "Set world respawn point", + "请手持物品来修改Lore": "Please hold the item to modify the Lore", + "物品Lore为空": "Item Lore is empty", + "物品Lore已修改": "Item Lore has been modified", + "物品Lore编辑功能": "Item Lore editing function", + "添加Lore": "Add Lore", + "删除Lore": "Delete Lore", + "修改Lore": "Modify Lore", + "<内容>": "", + "<- 请输入对应的lore行数": "<- Please enter the lore line number", + "你已退出隐身": "You are not invisible now", + "你已进入隐身": "You are invisible now", + "隐身功能": "Invisible function", + "/hide - 开启/关闭隐身": "/hide - Turn on/off invisible", + "§c/uban ban §7封禁玩家": "§c/uban ban §7Ban player", + "§c/uban unban §7解封玩家": "§c/uban unban §7Unban player", + "§c/heal §7治愈自己": "§c/heal §7Heal yourself", + "[死亡惩罚]你因为死亡随机掉落了%d个物品!": "[Death penalty] You randomly dropped %d items due to death!", + "[死亡惩罚]你因为死亡而扣除了%d个金币!": "[Death penalty] You deducted %d coins due to death!" } diff --git a/BasicFunctions/src/main/resources/plugin.yml b/BasicFunctions/src/main/resources/plugin.yml index 9ad3818..e4a4dd5 100644 --- a/BasicFunctions/src/main/resources/plugin.yml +++ b/BasicFunctions/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: BasicFunctions version: '${project.version}' main: com.ultikits.plugins.BasicFunctions -api-version: 600 +api-version: 605 authors: [ 'wisdomme' ] diff --git a/Economy/pom.xml b/Economy/pom.xml index 26360ab..7276f1e 100644 --- a/Economy/pom.xml +++ b/Economy/pom.xml @@ -21,7 +21,7 @@ com.ultikits UltiTools-API - 6.0.3 + 6.0.5 provided @@ -78,7 +78,7 @@ UltiEconomy UltiEconomy - A Economy Plugin + 多账户,利息发放,多人共享账户的经济模块 access_key.txt F:\SpigotServers\Servers\1.19.4\plugins\UltiTools\plugins diff --git a/Home/pom.xml b/Home/pom.xml index f69897e..53ef738 100755 --- a/Home/pom.xml +++ b/Home/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> UltiTools-Home com.ultikits.plugins - 1.0.0 + 1.0.2 4.0.0 @@ -18,7 +18,7 @@ com.ultikits UltiTools-API - 6.0.3 + 6.0.5 provided @@ -55,9 +55,9 @@ UltiTools-Home UltiTools-Home - A Home Plugin + 可视化GUI家模块 access_key.txt - F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins + F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins diff --git a/Home/src/main/java/com/ultikits/plugins/home/PluginMain.java b/Home/src/main/java/com/ultikits/plugins/home/PluginMain.java index d189de1..e44c2d5 100644 --- a/Home/src/main/java/com/ultikits/plugins/home/PluginMain.java +++ b/Home/src/main/java/com/ultikits/plugins/home/PluginMain.java @@ -3,20 +3,14 @@ package com.ultikits.plugins.home; import com.ultikits.plugins.home.config.HomeConfig; import com.ultikits.plugins.home.entity.HomeEntity; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; -import com.ultikits.ultitools.annotations.EnableAutoRegister; -import com.ultikits.ultitools.annotations.I18n; +import com.ultikits.ultitools.annotations.UltiToolsModule; import com.ultikits.ultitools.interfaces.DataOperator; import com.ultikits.ultitools.interfaces.DataStore; import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.stereotype.Component; -@Component -@ComponentScan -@I18n({"zh", "en"}) -@EnableAutoRegister +@UltiToolsModule public class PluginMain extends UltiToolsPlugin { @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") @Autowired diff --git a/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java b/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java index ab48092..7c0c0ae 100644 --- a/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java +++ b/Home/src/main/java/com/ultikits/plugins/home/commands/HomeCommands.java @@ -8,7 +8,6 @@ import com.ultikits.ultitools.annotations.command.*; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.Arrays; @@ -17,9 +16,11 @@ import java.util.List; @CmdTarget(CmdTarget.CmdTargetType.PLAYER) @CmdExecutor(permission = "ultikits.home.command.all", description = "家功能", alias = {"home"}) public class HomeCommands extends AbstractCommendExecutor { - @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") - @Autowired - private HomeService homeService; + private final HomeService homeService; + + public HomeCommands(HomeService homeService) { + this.homeService = homeService; + } @CmdMapping(format = "list") public void openList(@CmdSender Player player) { diff --git a/Home/src/main/java/com/ultikits/plugins/home/gui/HomeListGui.java b/Home/src/main/java/com/ultikits/plugins/home/gui/HomeListGui.java index 7bf384a..3fd597a 100644 --- a/Home/src/main/java/com/ultikits/plugins/home/gui/HomeListGui.java +++ b/Home/src/main/java/com/ultikits/plugins/home/gui/HomeListGui.java @@ -16,6 +16,7 @@ import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.List; public class HomeListGui extends PagingPage { @@ -37,6 +38,7 @@ public class HomeListGui extends PagingPage { public List setAllItems() { List icons = new ArrayList<>(); List homeList = home.getHomeList(player.getUniqueId()); + homeList.sort(Comparator.comparing(HomeEntity::getId)); int i = 0; for (HomeEntity homeEntity : homeList) { Location location = homeEntity.getHomeLocation(); @@ -51,7 +53,11 @@ public class HomeListGui extends PagingPage { player.closeInventory(); }); icons.add(icon); - i++; + if (i == beds.size() - 1) { + i = 0; + } else { + i++; + } } return icons; } diff --git a/Home/src/main/resources/plugin.yml b/Home/src/main/resources/plugin.yml index fa86150..c2ec49d 100644 --- a/Home/src/main/resources/plugin.yml +++ b/Home/src/main/resources/plugin.yml @@ -2,5 +2,5 @@ name: UltiTools-Home version: '${project.version}' main: com.ultikits.plugins.home.PluginMain base-package: com.ultikits.plugins.home -api-version: 603 +api-version: 605 authors: [ wisdomme ] diff --git a/MysqlConnector/pom.xml b/MysqlConnector/pom.xml index 7c5d787..0a98262 100644 --- a/MysqlConnector/pom.xml +++ b/MysqlConnector/pom.xml @@ -88,7 +88,7 @@ MysqlConnector MysqlConnector - A MysqlConnector Plugin + 连接MySQL数据库的必须前置模块 access_key.txt F:\SpigotServers\Servers\1.19.4\plugins\UltiTools\plugins diff --git a/Sidebar/pom.xml b/Sidebar/pom.xml index 1afb493..45fe5b1 100644 --- a/Sidebar/pom.xml +++ b/Sidebar/pom.xml @@ -6,7 +6,7 @@ com.ultikits.plugins Sidebar - 1.0.0 + 1.0.1 8 @@ -18,7 +18,7 @@ com.ultikits UltiTools-API - 6.0.0.202310142230 + 6.0.5 provided @@ -84,9 +84,9 @@ Sidebar UltiTools-Sidebar - Server Sidebar Display + 高性能支持变量的侧边栏显示 access_key.txt - F:\SpigotServers\Servers\1.20.4\plugins\UltiTools\plugins + F:\SpigotServers\Paper\1.20.4\plugins\UltiTools\plugins diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/PlayerJoinListener.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/PlayerJoinListener.java index 8bd3820..8b62d81 100644 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/PlayerJoinListener.java +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/PlayerJoinListener.java @@ -1,22 +1,36 @@ package com.ultikits.plugins.sidebar; +import com.ultikits.ultitools.annotations.EventListener; import fr.mrmicky.fastboard.FastBoard; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; +import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; + +@EventListener public class PlayerJoinListener implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); FastBoard board = new FastBoard(player); - board.updateTitle(ChatColor.translateAlternateColorCodes('&', SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle())); + board.updateTitle(coloredMsg(SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle())); SidebarPlugin.getInstance().getBoards().put(player.getUniqueId(), board); } + @EventHandler + public void onPlayerKick(PlayerKickEvent event) { + Player player = event.getPlayer(); + FastBoard board = SidebarPlugin.getInstance().getBoards().remove(player.getUniqueId()); + if (board != null) { + board.delete(); + } + } + @EventHandler public void onQuit(PlayerQuitEvent e) { Player player = e.getPlayer(); diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SbCommand.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SbCommand.java new file mode 100644 index 0000000..8b23f17 --- /dev/null +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SbCommand.java @@ -0,0 +1,37 @@ +package com.ultikits.plugins.sidebar; + +import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; +import com.ultikits.ultitools.annotations.command.*; +import fr.mrmicky.fastboard.FastBoard; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; + +@CmdExecutor(alias = {"sb"}) +@CmdTarget(CmdTarget.CmdTargetType.PLAYER) +public class SbCommand extends AbstractCommendExecutor { + + @CmdMapping(format = "close") + public void close(@CmdSender Player sender) { + SidebarPlugin.getInstance().getBoards().get(sender.getUniqueId()).delete(); + SidebarPlugin.getInstance().getBoards().remove(sender.getUniqueId()); + } + + @CmdMapping(format = "reload", requireOp = true) + public void reload() { + SidebarPlugin.getInstance().registerSelf(); + } + + @CmdMapping(format = "open") + public void open(@CmdSender Player player) { + FastBoard board = new FastBoard(player); + board.updateTitle(coloredMsg(SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getTitle())); + SidebarPlugin.getInstance().getBoards().put(player.getUniqueId(), board); + } + + @Override + protected void handleHelp(CommandSender sender) { + + } +} diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarConfig.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarConfig.java index 82e17e4..5337602 100644 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarConfig.java +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarConfig.java @@ -1,6 +1,7 @@ package com.ultikits.plugins.sidebar; import com.ultikits.ultitools.abstracts.AbstractConfigEntity; +import com.ultikits.ultitools.annotations.ConfigEntity; import com.ultikits.ultitools.annotations.ConfigEntry; import lombok.Getter; import lombok.Setter; @@ -10,12 +11,13 @@ import java.util.List; @Getter @Setter +@ConfigEntity("config/config.yml") public class SidebarConfig extends AbstractConfigEntity { - @ConfigEntry(path = "scoreBoardTitle", comment = "") + @ConfigEntry(path = "scoreBoardTitle", comment = "侧边栏标题") private String title = "欢迎加入服务器"; - @ConfigEntry(path = "scoreBoardUpdateInterval", comment = "") + @ConfigEntry(path = "scoreBoardUpdateInterval", comment = "侧边栏更新间隔(单位:Tick)推荐20(每秒更新一次),最低1,更低会导致性能问题") private int updateInterval = 20; - @ConfigEntry(path = "sidebarContent", comment = "") + @ConfigEntry(path = "sidebarContent", comment = "侧边栏内容(最多15行)") private List content = new ArrayList<>(); public SidebarConfig(String configFilePath) { diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarPlugin.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarPlugin.java index f0e795a..3fc759e 100644 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarPlugin.java +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/SidebarPlugin.java @@ -3,6 +3,7 @@ package com.ultikits.plugins.sidebar; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.abstracts.AbstractConfigEntity; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; +import com.ultikits.ultitools.annotations.UltiToolsModule; import fr.mrmicky.fastboard.FastBoard; import lombok.Getter; import me.clip.placeholderapi.PlaceholderAPI; @@ -12,23 +13,23 @@ import java.util.*; import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; +@UltiToolsModule public class SidebarPlugin extends UltiToolsPlugin { @Getter private static SidebarPlugin instance; @Getter private final Map boards = new HashMap<>(); - @Override - public boolean registerSelf() throws IOException { + public SidebarPlugin(){ + super(); instance = this; - getListenerManager().register(this, new PlayerJoinListener()); - int updateInterval = getConfig(SidebarConfig.class).getUpdateInterval(); - new UpdateTask().runTaskTimerAsynchronously(UltiTools.getInstance(), 0, Math.max(updateInterval, 1)); - return true; } @Override - public void unregisterSelf() { + public boolean registerSelf() { + int updateInterval = getConfig(SidebarConfig.class).getUpdateInterval(); + new UpdateTask().runTaskTimerAsynchronously(UltiTools.getInstance(), 0, Math.max(updateInterval, 1)); + return true; } @Override @@ -42,17 +43,4 @@ public class SidebarPlugin extends UltiToolsPlugin { new SidebarConfig("config/config.yml") ); } - - protected void updateBoard(FastBoard board) { - List list = new ArrayList<>(); - for (String s : getConfig(SidebarConfig.class).getContent()) { - list.add(coloredMsg(PlaceholderAPI.setPlaceholders(board.getPlayer(), s))); - } - board.updateLines(list); - } - - @Override - public void reloadSelf() { - UltiToolsPlugin.getConfigManager().register(this, new SidebarConfig("config/config.yml")); - } } diff --git a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/UpdateTask.java b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/UpdateTask.java index 97bdf77..3ee9564 100644 --- a/Sidebar/src/main/java/com/ultikits/plugins/sidebar/UpdateTask.java +++ b/Sidebar/src/main/java/com/ultikits/plugins/sidebar/UpdateTask.java @@ -1,16 +1,26 @@ package com.ultikits.plugins.sidebar; import fr.mrmicky.fastboard.FastBoard; +import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.scheduler.BukkitRunnable; +import java.util.ArrayList; +import java.util.List; + +import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; + public class UpdateTask extends BukkitRunnable { @Override public void run() { for (FastBoard board : SidebarPlugin.getInstance().getBoards().values()) { - if (board.isDeleted()){ + if (board.isDeleted() || !board.getPlayer().isOnline()){ continue; } - SidebarPlugin.getInstance().updateBoard(board); + List list = new ArrayList<>(); + for (String s : SidebarPlugin.getInstance().getConfig(SidebarConfig.class).getContent()) { + list.add(coloredMsg(PlaceholderAPI.setPlaceholders(board.getPlayer(), s))); + } + board.updateLines(list); } } } diff --git a/Sidebar/src/main/resources/plugin.yml b/Sidebar/src/main/resources/plugin.yml index fc2cbba..40dc9c0 100644 --- a/Sidebar/src/main/resources/plugin.yml +++ b/Sidebar/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Sidebar version: '${project.version}' main: com.ultikits.plugins.sidebar.SidebarPlugin -api-version: 600 -authors: [ wisdomme ] +api-version: 605 +authors: [ 'wisdomme' ] diff --git a/UltiTools-API/pom.xml b/UltiTools-API/pom.xml index 32c9f3f..5c1ac72 100755 --- a/UltiTools-API/pom.xml +++ b/UltiTools-API/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> UltiTools-API com.ultikits - 6.0.4 + 6.0.5 4.0.0 UltiTools-API This project is the base of the Ultitools plugin development. @@ -36,7 +36,8 @@ 1.8 UTF-8 - 4.1.13 + 4.3.0 + 5.8.25 @@ -131,6 +132,7 @@ ${project.build.directory}/UltiTools/lib + provided @@ -203,6 +205,18 @@ true + + com.ultikits + ultitools-maven-plugin + 1.0.0 + + UltiTools-API + UltiTools-API + UltiTools-API + access_key.txt + F:\SpigotServers\Paper\1.20.4\plugins + + @@ -251,7 +265,7 @@ com.github.MilkBowl VaultAPI - 1.7 + 1.7.1 provided @@ -261,8 +275,38 @@ cn.hutool - hutool-all - 5.8.20 + hutool-core + ${hutool.version} + + + cn.hutool + hutool-crypto + ${hutool.version} + + + cn.hutool + hutool-db + ${hutool.version} + + + cn.hutool + hutool-json + ${hutool.version} + + + cn.hutool + hutool-cache + ${hutool.version} + + + cn.hutool + hutool-cron + ${hutool.version} + + + cn.hutool + hutool-http + ${hutool.version} mysql @@ -279,7 +323,7 @@ net.kyori adventure-platform-bukkit - 4.3.0 + 4.3.2 com.github.hamza-cskn @@ -291,6 +335,12 @@ spring-context 5.3.31 + + me.clip + placeholderapi + 2.11.4 + provided + diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/UltiTools.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/UltiTools.java index ef7bba4..f41dc24 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/UltiTools.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/UltiTools.java @@ -1,6 +1,5 @@ package com.ultikits.ultitools; -import com.ultikits.ultitools.context.ContextConfig; import com.ultikits.ultitools.commands.PluginInstallCommands; import com.ultikits.ultitools.commands.UltiToolsCommands; import com.ultikits.ultitools.context.ContextConfig; @@ -8,20 +7,28 @@ import com.ultikits.ultitools.entities.Language; import com.ultikits.ultitools.interfaces.DataStore; import com.ultikits.ultitools.interfaces.Localized; import com.ultikits.ultitools.interfaces.VersionWrapper; +import com.ultikits.ultitools.listeners.PlayerJoinListener; import com.ultikits.ultitools.manager.*; import com.ultikits.ultitools.tasks.DataStoreWaitingTask; +import com.ultikits.ultitools.utils.CommonUtils; +import com.ultikits.ultitools.utils.Metrics; import lombok.Getter; import lombok.Setter; import mc.obliviate.inventory.InventoryAPI; import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.java.JavaPlugin; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.io.*; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLClassLoader; import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -75,7 +82,11 @@ public final class UltiTools extends JavaPlugin implements Localized { * @return the version of the UltiTools */ public static int getPluginVersion() { - return 604; + String versionString = getEnv().getString("version"); + if (versionString == null) { + throw new RuntimeException("Version not found in env.yml!"); + } + return Integer.parseInt(versionString.replace(".", "")); } /** @@ -163,10 +174,23 @@ public final class UltiTools extends JavaPlugin implements Localized { String result = new BufferedReader(new InputStreamReader(in)).lines().collect(Collectors.joining("")); this.language = new Language(result); + // Plugin classloader initialization + pluginClassLoader = getClassLoader(); + URL serverJar = CommonUtils.getServerJar(); + try { + if (serverJar != null) { + String name = new File(serverJar.toURI()).getName().split("\\.jar")[0]; + Bukkit.getLogger().info("[UltiTools-API] Spigot API detected: " + name); + } + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + URLClassLoader classLoader = new URLClassLoader(new URL[]{serverJar}, pluginClassLoader); + // Spring context initialization pluginClassLoader = getClassLoader(); context = new AnnotationConfigApplicationContext(); - context.setClassLoader(pluginClassLoader); + context.setClassLoader(classLoader); context.register(ContextConfig.class); context.refresh(); context.registerShutdownHook(); @@ -184,9 +208,11 @@ public final class UltiTools extends JavaPlugin implements Localized { throw new RuntimeException(e); } + Metrics metrics = new Metrics(this, 8652); + // bukkit plugin registration - getCommandManager().register(new UltiToolsCommands()); - getCommandManager().register(new PluginInstallCommands()); + getCommandManager().register(context.getBean(UltiToolsCommands.class)); + getCommandManager().register(context.getBean(PluginInstallCommands.class)); Bukkit.getServicesManager().register( PluginManager.class, @@ -194,6 +220,8 @@ public final class UltiTools extends JavaPlugin implements Localized { this, ServicePriority.Normal ); + + Bukkit.getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); } /** @@ -214,6 +242,7 @@ public final class UltiTools extends JavaPlugin implements Localized { stopEmbedWebServer(); pluginManager.close(); context.close(); + getCommandManager().close(); DataStoreManager.close(); getConfigManager().saveAll(); Bukkit.getServicesManager().unregisterAll(this); @@ -275,4 +304,20 @@ public final class UltiTools extends JavaPlugin implements Localized { } return this.adventure; } + + /** + * Get the economy provider + * + * @return the instance of the Economy provider + */ + public Economy getEconomy() { + if (Bukkit.getPluginManager().getPlugin("Vault") == null) { + throw new RuntimeException("Vault not found!"); + } + RegisteredServiceProvider registration = Bukkit.getServicesManager().getRegistration(Economy.class); + if (registration == null) { + throw new RuntimeException("Economy service not found!"); + } + return registration.getProvider(); + } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/AbstractCommendExecutor.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/AbstractCommendExecutor.java index b09cefc..84797d1 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/AbstractCommendExecutor.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/AbstractCommendExecutor.java @@ -4,8 +4,10 @@ import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.annotations.command.*; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -15,10 +17,12 @@ import org.bukkit.scheduler.BukkitRunnable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Array; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.*; +import java.util.function.Function; public abstract class AbstractCommendExecutor implements TabExecutor { private final BiMap mappings = HashBiMap.create(); @@ -26,7 +30,11 @@ public abstract class AbstractCommendExecutor implements TabExecutor { private final BiMap ServerLock = HashBiMap.create(); private final BiMap CmdCoolDown = HashBiMap.create(); + @Getter + private final Map>, Function> parsers = new HashMap<>(); + public AbstractCommendExecutor() { + initParsers(); scanCommandMappings(); } @@ -34,6 +42,31 @@ public abstract class AbstractCommendExecutor implements TabExecutor { return this; } + @SuppressWarnings("deprecation") + private void initParsers() { + parsers.put(Arrays.asList(Boolean[].class, Boolean.class, boolean[].class, boolean.class), Boolean::parseBoolean); + parsers.put(Arrays.asList(Double[].class, Double.class, double[].class, double.class), Double::parseDouble); + parsers.put(Arrays.asList(Integer[].class, Integer.class, int[].class, int.class), Integer::parseInt); + parsers.put(Arrays.asList(Float[].class, Float.class, float[].class, float.class), Float::parseFloat); + parsers.put(Arrays.asList(Short[].class, Short.class, short[].class, short.class), Short::parseShort); + parsers.put(Arrays.asList(Short[].class, Short.class, short[].class, short.class), Byte::parseByte); + parsers.put(Arrays.asList(OfflinePlayer[].class, OfflinePlayer.class), Bukkit::getOfflinePlayer); + parsers.put(Arrays.asList(Long[].class, Long.class, long[].class, long.class), Long::parseLong); + parsers.put(Arrays.asList(Material[].class, Material.class), Material::getMaterial); + parsers.put(Arrays.asList(Player[].class, Player.class), Bukkit::getPlayerExact); + parsers.put(Arrays.asList(UUID[].class, UUID.class), UUID::fromString); + parsers.put(Arrays.asList(String[].class, String.class), s -> s); + } + + private Function getParser(Class type) { + //noinspection unchecked + return (Function) parsers.keySet().stream() + .filter(classes -> classes.stream().anyMatch(clazz -> clazz.isAssignableFrom(type))) + .findFirst() + .map(parsers::get) + .orElse(null); + } + private void scanCommandMappings() { Class clazz = this.getClass(); Method[] methods = clazz.getDeclaredMethods(); @@ -44,70 +77,71 @@ public abstract class AbstractCommendExecutor implements TabExecutor { } } - private Map getParams(String[] args, String format) { + private static Map getParams(String[] args, String format) { + if (args.length == 0) { + return Collections.emptyMap(); + } + String[] formatArgs = format.split(" "); - Map params = new HashMap<>(); - for (int i = 0; i < formatArgs.length; i++) { - if (formatArgs[i].startsWith("<") && formatArgs[i].endsWith(">")) { - params.put(formatArgs[i].substring(1, formatArgs[i].length() - 1), args[i]); - } - if (formatArgs[i].startsWith("[") && formatArgs[i].endsWith("]")) { - params.put(formatArgs[i].substring(1, formatArgs[i].length() - 1), args[i]); + Map params = new HashMap<>(); + List paramList = new ArrayList<>(); + int index = 0; + + for (String arg : args) { + String currentFormatArg = formatArgs[index]; + + if (currentFormatArg.startsWith("<") && currentFormatArg.endsWith("...>")) { + paramList.add(arg); + } else if (currentFormatArg.startsWith("<") && currentFormatArg.endsWith(">")) { + String paramName = currentFormatArg.substring(1, currentFormatArg.length() - 1); + params.put(paramName, new String[]{arg}); } + + index = (index + 1) % formatArgs.length; } + + if (!paramList.isEmpty()) { + params.put(formatArgs[index].substring(1, formatArgs[index].length() - 1), paramList.toArray(new String[0])); + } + return params; } private Method matchMethod(String[] args) { + if (args.length == 0) { + return mappings.getOrDefault("", null); + } for (Map.Entry entry : mappings.entrySet()) { String format = entry.getKey(); - if (format.isEmpty() && args.length == 0) { - return entry.getValue(); - } String[] formatArgs = format.split(" "); - String lastArg = formatArgs[formatArgs.length - 1]; - boolean match; - if (lastArg.startsWith("[") && lastArg.endsWith("]")) { - if (formatArgs.length - args.length == 1) { - continue; - } - match = true; - for (int i = 0; i < formatArgs.length - 1; i++) { - String formatArg = formatArgs[i]; - String actualArg = args[i]; - if (formatArg.startsWith("<") && formatArg.endsWith(">")) { - continue; - } - if (!formatArg.equalsIgnoreCase(actualArg)) { - match = false; - break; - } - } - } else { - if (formatArgs.length != args.length) { - continue; - } - match = true; - for (int i = 0; i < formatArgs.length; i++) { - String formatArg = formatArgs[i]; - String actualArg = args[i]; - if (formatArg.startsWith("<") && formatArg.endsWith(">")) { - continue; - } - if (!formatArg.equalsIgnoreCase(actualArg)) { - match = false; - break; - } + boolean match = true; + + for (int i = 0; i < formatArgs.length - 1; i++) { + if (!matchesArgument(formatArgs[i], args[i])) { + match = false; + break; } } - if (match) { + if (match && matchesLastArgument(formatArgs[formatArgs.length - 1], args[formatArgs.length - 1])) { return entry.getValue(); } } return null; } + private boolean matchesArgument(String formatArg, String actualArg) { + return formatArg.startsWith("<") && formatArg.endsWith(">") || formatArg.equalsIgnoreCase(actualArg); + } + + private boolean matchesLastArgument(String formatArg, String actualArg) { + if (formatArg.endsWith("...>")) { + return true; + } + return matchesArgument(formatArg, actualArg); + } + + private boolean checkSender(CommandSender sender) { Class clazz = this.getClass(); if (!clazz.isAnnotationPresent(CmdTarget.class)) { @@ -143,21 +177,23 @@ public abstract class AbstractCommendExecutor implements TabExecutor { private boolean checkPermission(CommandSender sender) { Class clazz = this.getClass(); + if (!clazz.isAnnotationPresent(CmdExecutor.class)) { return true; } + CmdExecutor cmdExecutor = clazz.getAnnotation(CmdExecutor.class); - if (cmdExecutor.permission().isEmpty()) { - return true; - } String permission = cmdExecutor.permission(); - if (sender.hasPermission(permission)) { + + if (permission.isEmpty() || sender.hasPermission(permission)) { return true; } + sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("你没有权限执行这个指令!")); return false; } + private boolean checkPermission(CommandSender sender, Method method) { if (!method.isAnnotationPresent(CmdMapping.class)) { return true; @@ -238,95 +274,60 @@ public abstract class AbstractCommendExecutor implements TabExecutor { return false; } - private Object[] parseParams(String[] strings, Method method, CommandSender commandSender) { - Map params = getParams(strings, mappings.inverse().get(method)); + private Object[] buildParams(String[] strings, Method method, CommandSender commandSender) { + Map params = getParams(strings, mappings.inverse().get(method)); Parameter[] parameters = method.getParameters(); + if (parameters.length == 0) { return new Object[0]; } - List ParamList = new ArrayList<>(); + + List paramList = new ArrayList<>(); + for (Parameter parameter : parameters) { - if (parameter.getType().equals(Player.class)) { - Player player = (Player) commandSender; - ParamList.add(parameter.isAnnotationPresent(CmdSender.class) ? player : null); - continue; - } - if (parameter.getType().equals(CommandSender.class)) { - ParamList.add(parameter.isAnnotationPresent(CmdSender.class) ? commandSender : null); + Class paramType = parameter.getType(); + + if (paramType.equals(Player.class) || paramType.equals(CommandSender.class)) { + boolean isCmdSenderAnnotationPresent = parameter.isAnnotationPresent(CmdSender.class); + + if (paramType.equals(Player.class) && commandSender instanceof Player) { + paramList.add(isCmdSenderAnnotationPresent ? commandSender : null); + } else if (paramType.equals(CommandSender.class)) { + paramList.add(isCmdSenderAnnotationPresent ? commandSender : null); + } + continue; } + if (parameter.isAnnotationPresent(CmdParam.class)) { CmdParam cmdParam = parameter.getAnnotation(CmdParam.class); - String value = params.get(cmdParam.value()); + String[] value = params.get(cmdParam.value()); try { - if (parameter.getType() == float.class || parameter.getType() == Float.class) { - ParamList.add(Float.parseFloat(value)); - continue; - } - if (parameter.getType() == double.class || parameter.getType() == Double.class) { - ParamList.add(Double.parseDouble(value)); - continue; - } - if (parameter.getType() == int.class || parameter.getType() == Integer.class) { - ParamList.add(Integer.parseInt(value)); - continue; - } - } catch (NumberFormatException e) { - commandSender.sendMessage( - ChatColor.RED + String.format( - UltiTools.getInstance().i18n("参数 '%s' 格式错误:'%s' 不是一个有效的 %s 类型"), - cmdParam.value(), value, parameter.getType().getName() - )); + paramList.add(parseType(value, paramType)); + } catch (Exception e) { + commandSender.sendMessage(ChatColor.RED + e.getMessage()); + //noinspection CallToPrintStackTrace + e.printStackTrace(); return null; } - if (parameter.getType() == OfflinePlayer.class) { - ParamList.add(Bukkit.getOfflinePlayer(value)); - continue; - } - if (parameter.getType() == Player.class) { - Player player = Bukkit.getPlayerExact(value); - if (player == null) { - commandSender.sendMessage( - ChatColor.RED + String.format( - UltiTools.getInstance().i18n("玩家 \"%s\" 未找到"), - cmdParam.value(), value, parameter.getType().getName() - )); - return null; - } - ParamList.add(player); - } - ParamList.add(value); } else { - ParamList.add(null); - } - if (parameter.isAnnotationPresent(OptionalParam.class)) { - if (parameter.getType() == Map.class) { - String format = method.getAnnotation(CmdMapping.class).format(); - String OptionParams = params.get(format.split(" ")[format.split(" ").length - 1]); - ParamList.add(parseOptionalParams(OptionParams)); - } else { - ParamList.add(null); - } + paramList.add(null); } } - return ParamList.toArray(); + return paramList.toArray(); } - private Map> parseOptionalParams(String OptionalParam) { - Map> resultMap = new HashMap<>(); - - String[] optionGroups = OptionalParam.split(";"); - for (String optionGroup : optionGroups) { - String[] parts = optionGroup.split("="); - if (parts.length == 2) { - String optionName = parts[0]; - String[] arguments = parts[1].split(","); - - resultMap.put(optionName, Arrays.asList(arguments)); + private Object parseType(String[] value, Class type) { + Function parser = getParser(type); + if (type.isArray()) { + Object array = Array.newInstance(type.getComponentType(), value.length); + for (int i = 0; i < value.length; i++) { + Array.set(array, i, parser.apply(value[i])); } + return array; + } else { + return parser.apply(value[0]); } - - return resultMap; } private void setCoolDown(CommandSender commandSender, Method method) { @@ -414,20 +415,23 @@ public abstract class AbstractCommendExecutor implements TabExecutor { if (checkCD(commandSender)) { return true; } - Object[] params = parseParams(strings, method, commandSender); + Object[] params = buildParams(strings, method, commandSender); + if (params == null) { + return true; + } BukkitRunnable bukkitRunnable = new BukkitRunnable() { @Override public void run() { - if (method.isAnnotationPresent(UsageLimit.class)) { - if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.ALL)) { + UsageLimit usageLimit = method.getAnnotation(UsageLimit.class); + + if (usageLimit != null) { + if (usageLimit.value().equals(UsageLimit.LimitType.ALL)) { ServerLock.put(((Player) commandSender).getUniqueId(), method); - } - if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.SENDER)) { - if (commandSender instanceof Player) { - SenderLock.put(((Player) commandSender).getUniqueId(), method); - } + } else if (usageLimit.value().equals(UsageLimit.LimitType.SENDER) && commandSender instanceof Player) { + SenderLock.put(((Player) commandSender).getUniqueId(), method); } } + try { setCoolDown(commandSender, method); method.invoke(getInstance(), params); @@ -435,14 +439,11 @@ public abstract class AbstractCommendExecutor implements TabExecutor { sendErrorMessage(commandSender, command); throw new RuntimeException(e); } finally { - if (method.isAnnotationPresent(UsageLimit.class)) { - if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.ALL)) { + if (usageLimit != null) { + if (usageLimit.value().equals(UsageLimit.LimitType.ALL)) { ServerLock.remove(((Player) commandSender).getUniqueId()); - } - if (method.getAnnotation(UsageLimit.class).value().equals(UsageLimit.LimitType.SENDER)) { - if (commandSender instanceof Player) { - SenderLock.remove(((Player) commandSender).getUniqueId()); - } + } else if (usageLimit.value().equals(UsageLimit.LimitType.SENDER) && commandSender instanceof Player) { + SenderLock.remove(((Player) commandSender).getUniqueId()); } } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/UltiToolsPlugin.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/UltiToolsPlugin.java index 8f51e01..fbdaec5 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/UltiToolsPlugin.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/UltiToolsPlugin.java @@ -1,5 +1,6 @@ package com.ultikits.ultitools.abstracts; +import cn.hutool.core.comparator.VersionComparator; import cn.hutool.core.io.FileUtil; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.annotations.EnableAutoRegister; @@ -15,6 +16,7 @@ import lombok.Setter; import lombok.SneakyThrows; import org.bukkit.configuration.file.YamlConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.core.annotation.AnnotationUtils; import java.io.*; import java.net.JarURLConnection; @@ -54,16 +56,16 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl private AnnotationConfigApplicationContext context; @SneakyThrows - public UltiToolsPlugin(){ - InputStream inputStream = getInputStream(); - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + public UltiToolsPlugin() { + InputStream inputStream = getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); YamlConfiguration pluginConfig = YamlConfiguration.loadConfiguration(reader); - version = pluginConfig.getString("version"); - pluginName = pluginConfig.getString("name"); - authors = pluginConfig.getStringList("authors"); - loadAfter = pluginConfig.getStringList("loadAfter"); - minUltiToolsVersion = pluginConfig.getInt("api-version"); - mainClass = pluginConfig.getString("mainClass"); + version = pluginConfig.getString("version"); + pluginName = pluginConfig.getString("name"); + authors = pluginConfig.getStringList("authors"); + loadAfter = pluginConfig.getStringList("loadAfter"); + minUltiToolsVersion = pluginConfig.getInt("api-version"); + mainClass = pluginConfig.getString("main"); inputStream.close(); reader.close(); @@ -99,7 +101,7 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl String result = new BufferedReader(new InputStreamReader(in)) .lines().collect(Collectors.joining("")); language = new Language(result); - }else { + } else { language = new Language("{}"); } } else { @@ -109,31 +111,6 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl initConfig(); } - public final void initConfig() { - EnableAutoRegister annotation = this.getClass().getAnnotation(EnableAutoRegister.class); - if (annotation != null && annotation.config()) { - for (String packageName : CommonUtils.getPluginPackages(this)) { - UltiTools.getInstance().getConfigManager().registerAll( - this, packageName, this.getClass().getClassLoader() - ); - } - } else { - List allConfigs = this.getAllConfigs(); - for (AbstractConfigEntity configEntity : allConfigs) { - UltiToolsPlugin.getConfigManager().register(this, configEntity); - } - } - } - - private InputStream getInputStream() throws IOException { - CodeSource src = this.getClass().getProtectionDomain().getCodeSource(); - URL jar = src.getLocation(); - String path = jar.getPath().startsWith("/") ? jar.getPath() : jar.getPath().substring(1); - URL url = new URL("jar:file:" + path + "!/plugin.yml"); - JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); - return jarConnection.getInputStream(); - } - public static ConfigManager getConfigManager() { return UltiTools.getInstance().getConfigManager(); } @@ -154,6 +131,31 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl return UltiTools.getInstance().getVersionWrapper(); } + public final void initConfig() { + EnableAutoRegister annotation = AnnotationUtils.findAnnotation(this.getClass(), EnableAutoRegister.class); + if (annotation != null && annotation.config()) { + for (String packageName : CommonUtils.getPluginPackages(this)) { + UltiTools.getInstance().getConfigManager().registerAll( + this, packageName, this.getClass().getClassLoader() + ); + } + } else { + List allConfigs = this.getAllConfigs(); + for (AbstractConfigEntity configEntity : allConfigs) { + UltiToolsPlugin.getConfigManager().register(this, configEntity); + } + } + } + + private InputStream getInputStream() throws IOException { + CodeSource src = this.getClass().getProtectionDomain().getCodeSource(); + URL jar = src.getLocation(); + String path = jar.getPath().startsWith("/") ? jar.getPath() : jar.getPath().substring(1); + URL url = new URL("jar:file:" + path + "!/plugin.yml"); + JarURLConnection jarConnection = (JarURLConnection) url.openConnection(); + return jarConnection.getInputStream(); + } + protected final String getConfigFolder() { return UltiTools.getInstance().getDataFolder().getAbsolutePath() + "/pluginConfig/" + this.getPluginName(); } @@ -240,4 +242,19 @@ public abstract class UltiToolsPlugin implements IPlugin, Localized, Configurabl public final String i18n(String code, String str) { return this.getLanguage().getLocalizedText(str); } + + public boolean isNewerVersionThan(UltiToolsPlugin plugin) { + return VersionComparator.INSTANCE.compare(this.getVersion(), plugin.getVersion()) > 0; + } + + @Override + public void unregisterSelf() { + getCommandManager().unregisterAll(this); + getListenerManager().unregisterAll(this); + } + + @Override + public void reloadSelf() { + getConfigManager().reloadConfigs(this); + } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/OkCancelPage.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/OkCancelPage.java index 6146459..c4b92c9 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/OkCancelPage.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/OkCancelPage.java @@ -5,13 +5,14 @@ import com.ultikits.ultitools.entities.Colors; import mc.obliviate.inventory.Gui; import mc.obliviate.inventory.Icon; import net.kyori.adventure.text.Component; -import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.inventory.InventoryType; import org.jetbrains.annotations.NotNull; +import static com.ultikits.ultitools.utils.MessageUtils.coloredMsg; + public abstract class OkCancelPage extends Gui { public OkCancelPage(@NotNull Player player, @NotNull String id, String title, int rows) { super(player, id, title, rows); @@ -35,13 +36,13 @@ public abstract class OkCancelPage extends Gui { lastRowBackground.setName(" "); this.fillRow(lastRowBackground, getSize() / 9 - 1); Icon ok = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN)); - ok.setName(ChatColor.translateAlternateColorCodes('&', UltiTools.getInstance().i18n("OK"))); + ok.setName(coloredMsg(UltiTools.getInstance().i18n("OK"))); ok.onClick((e) -> { onOk(e); player.closeInventory(); }); Icon cancel = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.RED)); - cancel.setName(ChatColor.translateAlternateColorCodes('&', UltiTools.getInstance().i18n("取消"))); + cancel.setName(coloredMsg(UltiTools.getInstance().i18n("取消"))); cancel.onClick((e) -> { onCancel(e); player.closeInventory(); diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/PagingPage.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/PagingPage.java index b9522f1..f4dfc00 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/PagingPage.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/abstracts/guis/PagingPage.java @@ -45,9 +45,17 @@ public abstract class PagingPage extends Gui { @Override public void onOpen(InventoryOpenEvent event) { + updateItems(); + } + + public void updateItems() { + paginationManager.getItems().clear(); Icon lastRowBackground = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GRAY)); lastRowBackground.setName(" "); this.fillRow(lastRowBackground, getSize() / 9 - 1); + for (Icon icon : setAllItems()) { + paginationManager.addItem(icon); + } Icon next = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN)); next.setName(info(UltiTools.getInstance().i18n("下一页"))); if (this.paginationManager.isLastPage()) { @@ -58,6 +66,7 @@ public abstract class PagingPage extends Gui { return; } this.paginationManager.goNextPage(); + updateItems(); }); Icon last = new Icon(UltiTools.getInstance().getVersionWrapper().getColoredPlaneGlass(Colors.GREEN)); last.setName(info(UltiTools.getInstance().i18n("上一页"))); @@ -69,17 +78,10 @@ public abstract class PagingPage extends Gui { return; } this.paginationManager.goPreviousPage(); + updateItems(); }); this.addItem(getLastSlot() - 3, next); this.addItem(getLastSlot() - 5, last); - updateItems(); - } - - public void updateItems() { - paginationManager.getItems().clear(); - for (Icon icon : setAllItems()) { - paginationManager.addItem(icon); - } paginationManager.update(); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EnableAutoRegister.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EnableAutoRegister.java index 810fb05..c107ad3 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EnableAutoRegister.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EnableAutoRegister.java @@ -1,12 +1,10 @@ package com.ultikits.ultitools.annotations; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Documented public @interface EnableAutoRegister { String scanPackage() default ""; boolean eventListener() default true; diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java index 9d44ac4..f030a2e 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/EventListener.java @@ -1,11 +1,13 @@ package com.ultikits.ultitools.annotations; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import org.springframework.stereotype.Component; +import java.lang.annotation.*; + +@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Component public @interface EventListener { + boolean manualRegister() default false; } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/I18n.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/I18n.java index 2b37e99..0057423 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/I18n.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/I18n.java @@ -1,12 +1,10 @@ package com.ultikits.ultitools.annotations; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) +@Documented public @interface I18n { - String[] value(); + String[] value() default {}; } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/UltiToolsModule.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/UltiToolsModule.java new file mode 100644 index 0000000..d0afe77 --- /dev/null +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/UltiToolsModule.java @@ -0,0 +1,36 @@ +package com.ultikits.ultitools.annotations; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.AliasFor; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@EnableAutoRegister +@I18n +@ComponentScan +@Configuration +public @interface UltiToolsModule { + @AliasFor(annotation = ComponentScan.class, attribute = "basePackages") + String[] scanBasePackages() default {}; + + @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses") + Class[] scanBasePackageClasses() default {}; + + @AliasFor(annotation = EnableAutoRegister.class, attribute = "eventListener") + boolean eventListener() default true; + + @AliasFor(annotation = EnableAutoRegister.class, attribute = "cmdExecutor") + boolean cmdExecutor() default true; + + @AliasFor(annotation = EnableAutoRegister.class, attribute = "config") + boolean config() default true; + + @AliasFor(annotation = I18n.class, attribute = "value") + String[] i18n() default {}; +} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java index e36b4e2..e83729d 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/annotations/command/CmdExecutor.java @@ -1,5 +1,7 @@ package com.ultikits.ultitools.annotations.command; +import org.springframework.stereotype.Component; + import java.lang.annotation.*; /** @@ -11,6 +13,7 @@ import java.lang.annotation.*; @Documented @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) +@Component public @interface CmdExecutor { /** @@ -32,4 +35,9 @@ public @interface CmdExecutor { * @return 是否要求OP */ boolean requireOp() default false; + + /** + * @return 是否手动注册 + */ + boolean manualRegister() default false; } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/PluginInstallCommands.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/PluginInstallCommands.java index 34bb7cd..0f5c94c 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/PluginInstallCommands.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/PluginInstallCommands.java @@ -121,7 +121,7 @@ public class PluginInstallCommands extends AbstractCommendExecutor { @CmdMapping(format = "install ") public void installPlugin(@CmdSender CommandSender sender, @CmdParam("plugin") String plugin, @CmdParam("version") String version) { if (PluginInstallUtils.installPlugin(plugin, version)) { - sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!")); + sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!请务必删除旧版本模块!")); } else { sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("安装失败!")); } @@ -130,7 +130,7 @@ public class PluginInstallCommands extends AbstractCommendExecutor { @CmdMapping(format = "install ") public void installPlugin(@CmdSender CommandSender sender, @CmdParam("plugin") String plugin) { if (PluginInstallUtils.installLatestPlugin(plugin)) { - sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!")); + sender.sendMessage(ChatColor.GREEN + UltiTools.getInstance().i18n("安装成功!请重启服务器!请务必删除旧版本模块!")); } else { sender.sendMessage(ChatColor.RED + UltiTools.getInstance().i18n("安装失败!")); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/UltiToolsCommands.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/UltiToolsCommands.java index bc188db..6afb1cc 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/UltiToolsCommands.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/commands/UltiToolsCommands.java @@ -3,10 +3,7 @@ package com.ultikits.ultitools.commands; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.abstracts.AbstractCommendExecutor; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; -import com.ultikits.ultitools.annotations.command.CmdExecutor; -import com.ultikits.ultitools.annotations.command.CmdMapping; -import com.ultikits.ultitools.annotations.command.CmdSender; -import com.ultikits.ultitools.annotations.command.CmdTarget; +import com.ultikits.ultitools.annotations.command.*; import org.bukkit.command.CommandSender; import java.io.IOException; diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/entities/common/WorldLocation.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/entities/common/WorldLocation.java index 523b33a..377dcbb 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/entities/common/WorldLocation.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/entities/common/WorldLocation.java @@ -2,6 +2,7 @@ package com.ultikits.ultitools.entities.common; import lombok.Data; import lombok.NoArgsConstructor; +import org.bukkit.Bukkit; import org.bukkit.Location; import java.io.Serializable; @@ -34,6 +35,10 @@ public class WorldLocation implements Serializable { this.pitch = pitch; } + public Location toLocation() { + return new Location(Bukkit.getWorld(world), x, y, z, yaw, pitch); + } + @Override public String toString() { return "{" diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/IPlugin.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/IPlugin.java index 61f3377..99eed20 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/IPlugin.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/IPlugin.java @@ -24,6 +24,5 @@ public interface IPlugin { /** * 重载此插件模块时调用的方法,此重载并非重启模块,不会调用{@link #registerSelf()}和{@link #unregisterSelf()}。 */ - default void reloadSelf() { - } + void reloadSelf(); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/Localized.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/Localized.java index 5da46fd..9759d29 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/Localized.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/Localized.java @@ -1,6 +1,7 @@ package com.ultikits.ultitools.interfaces; import com.ultikits.ultitools.annotations.I18n; +import org.springframework.core.annotation.AnnotationUtils; import java.util.ArrayList; import java.util.Arrays; @@ -19,9 +20,8 @@ public interface Localized { * @return 支持的语言代码 Supported language codes */ default List supported() { - Class clazz = this.getClass(); - if (clazz.isAnnotationPresent(I18n.class)) { - I18n i18n = clazz.getAnnotation(I18n.class); + I18n i18n = AnnotationUtils.findAnnotation(this.getClass(), I18n.class); + if (i18n != null) { return Arrays.asList(i18n.value()); } else { return new ArrayList<>(); diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempEventHandler.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempEventHandler.java new file mode 100644 index 0000000..192f124 --- /dev/null +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempEventHandler.java @@ -0,0 +1,8 @@ +package com.ultikits.ultitools.interfaces; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; + +public interface TempEventHandler { + boolean handle(E event); +} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempListener.java new file mode 100644 index 0000000..bbebd9b --- /dev/null +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/TempListener.java @@ -0,0 +1,12 @@ +package com.ultikits.ultitools.interfaces; + +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; + +public interface TempListener extends Listener { + void register(); + + default void unregister() { + HandlerList.unregisterAll(this); + } +} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/PlayerTempListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/PlayerTempListener.java new file mode 100644 index 0000000..e05f719 --- /dev/null +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/PlayerTempListener.java @@ -0,0 +1,55 @@ +package com.ultikits.ultitools.interfaces.impl; + +import com.ultikits.ultitools.UltiTools; +import com.ultikits.ultitools.interfaces.TempEventHandler; +import com.ultikits.ultitools.interfaces.TempListener; +import lombok.*; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.PlayerEvent; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +public class PlayerTempListener implements TempListener { + private Class eventClass; + private EventPriority priority = EventPriority.NORMAL; + private TempEventHandler eventHandler; + private Player player; + + public PlayerTempListener(Class eventClass, TempEventHandler eventHandler) { + this.eventClass = eventClass; + this.eventHandler = eventHandler; + } + + public PlayerTempListener(Class eventClass, TempEventHandler eventHandler, Player player) { + this.eventClass = eventClass; + this.eventHandler = eventHandler; + this.player = player; + } + + @SuppressWarnings("unchecked") + public void register() { + Bukkit.getServer().getPluginManager().registerEvent(eventClass, this, priority, + (ignored, event) -> { + try { + if (player == null) { + if (eventHandler.handle((E) event)) { + unregister(); + } + } else if (((E) event).getPlayer().equals(player)) { + if (eventHandler.handle((E) event)) { + unregister(); + } + } + } catch (ClassCastException e) { + throw new RuntimeException(e); + } + }, + UltiTools.getInstance() + ); + } +} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleJsonDataOperator.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleJsonDataOperator.java index 1a7ed88..54862db 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleJsonDataOperator.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleJsonDataOperator.java @@ -61,7 +61,7 @@ public class SimpleJsonDataOperator implements Dat @Override public boolean exist(WhereCondition... whereConditions) { - return getAll(whereConditions).size() > 0; + return !getAll(whereConditions).isEmpty(); } @Override diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleTempListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleTempListener.java new file mode 100644 index 0000000..6a536f7 --- /dev/null +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/interfaces/impl/SimpleTempListener.java @@ -0,0 +1,41 @@ +package com.ultikits.ultitools.interfaces.impl; + +import com.ultikits.ultitools.UltiTools; +import com.ultikits.ultitools.interfaces.TempEventHandler; +import com.ultikits.ultitools.interfaces.TempListener; +import lombok.*; +import org.bukkit.Bukkit; +import org.bukkit.event.Event; +import org.bukkit.event.EventPriority; + +@Builder +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +public class SimpleTempListener implements TempListener { + private Class eventClass; + private EventPriority priority = EventPriority.NORMAL; + private TempEventHandler eventHandler; + + public SimpleTempListener(Class eventClass, TempEventHandler eventHandler) { + this.eventClass = eventClass; + this.eventHandler = eventHandler; + } + + public void register() { + Bukkit.getServer().getPluginManager().registerEvent(eventClass, this, priority, + (ignored, event) -> { + try { + //noinspection unchecked + if (eventHandler.handle((E) event)){ + unregister(); + } + } catch (ClassCastException e) { + throw new RuntimeException(e); + } + }, + UltiTools.getInstance() + ); + } +} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/listeners/PlayerJoinListener.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/listeners/PlayerJoinListener.java new file mode 100644 index 0000000..30e0592 --- /dev/null +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/listeners/PlayerJoinListener.java @@ -0,0 +1,54 @@ +package com.ultikits.ultitools.listeners; + +import com.ultikits.ultitools.UltiTools; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Arrays; +import java.util.List; + +public class PlayerJoinListener implements Listener { + private final List placeholderList = Arrays.asList("player", "server", "math", "vault", "localtime"); + + // make the word first letter uppercase + public static String toUpperCaseFirstOne(String s) { + if (Character.isUpperCase(s.charAt(0))) + return s; + else + return Character.toUpperCase(s.charAt(0)) + s.substring(1); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + try { + boolean reload = false; + long time = 30L; + for (String placeholder : placeholderList) { + if (!PlaceholderAPI.isRegistered(placeholder)) { + reload = true; + new BukkitRunnable() { + @Override + public void run() { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "papi ecloud download " + toUpperCaseFirstOne(placeholder)); + } + }.runTaskLater(UltiTools.getInstance(), time); + time += 30L; + } + } + if (reload) { + new BukkitRunnable() { + @Override + public void run() { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "papi reload"); + } + }.runTaskLater(UltiTools.getInstance(), time + 30L); + } + } catch (Exception ignored) { + + } + } +} diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java index cf9824a..d3775f1 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/CommandManager.java @@ -6,6 +6,7 @@ import com.ultikits.ultitools.abstracts.UltiToolsPlugin; import com.ultikits.ultitools.annotations.command.CmdExecutor; import com.ultikits.ultitools.utils.PackageScanUtils; import org.bukkit.Bukkit; +import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandMap; import org.bukkit.command.PluginCommand; @@ -15,32 +16,75 @@ import org.bukkit.plugin.SimplePluginManager; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import java.util.Arrays; -import java.util.Objects; -import java.util.Set; +import java.util.*; public class CommandManager { + private final Map> commandListMap = new HashMap<>(); + + /** + * 手动注册一个命令。仅用于注册被@CmdExecutor注解的类。会自动注入依赖。 + * + * @param plugin 插件实例 + * @param clazz 命令执行器类 + * @param permission 权限 + * @param description 描述 + * @param aliases 别名 + */ + public void register(UltiToolsPlugin plugin, Class clazz, String permission, String description, String... aliases) { + CommandExecutor commandExecutor = UltiTools.getInstance().getContext().getBean(clazz); + register(plugin, commandExecutor, permission, description, aliases); + } - public void register(CommandExecutor commandExecutor, String permission, String description, String... aliases) { + /** + * 手动注册一个命令,不会被容器管理。不会自动注入依赖。 + * + * @param plugin 插件实例 + * @param commandExecutor 命令执行器实例 + * @param permission 权限 + * @param description 描述 + * @param aliases 别名 + */ + private void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor, String permission, String description, String... aliases) { + register(commandExecutor, permission, plugin.i18n(description), aliases); PluginCommand command = getCommand(aliases[0], UltiTools.getInstance()); + commandListMap.computeIfAbsent(plugin, k -> new ArrayList<>()); + List commands = commandListMap.get(plugin); + if (!commands.contains(command)) { + commands.add(command); + } + } - command.setAliases(Arrays.asList(aliases)); - command.setPermission(permission); - command.setDescription(description); - getCommandMap().register(UltiTools.getInstance().getDescription().getName(), command); - command.setExecutor(commandExecutor); + /** + * 手动注册一个命令。仅用于注册被@CmdExecutor注解的类。会自动注入依赖。 + * + * @param plugin 插件实例 + * @param clazz 命令执行器类 + */ + public void register(UltiToolsPlugin plugin, Class clazz) { + CommandExecutor commandExecutor = plugin.getContext().getBean(clazz); + register(plugin, commandExecutor); } - public void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor) { + /** + * 手动注册一个命令,不会被容器管理。不会自动注入依赖。 + * + * @param plugin 插件实例 + * @param commandExecutor 命令执行器实例 + */ + private void register(UltiToolsPlugin plugin, CommandExecutor commandExecutor) { + Class clazz = commandExecutor.getClass(); + + if (clazz.isAnnotationPresent(CmdExecutor.class)) { + CmdExecutor cmdExecutor = clazz.getAnnotation(CmdExecutor.class); + register(commandExecutor, cmdExecutor.permission(), plugin.i18n(cmdExecutor.description()), cmdExecutor.alias()); + return; + } else { + Bukkit.getLogger().warning("CommandExecutor " + clazz.getName() + " is not annotated with @CmdExecutor, please use legacy method to register command."); + } plugin.getContext().getAutowireCapableBeanFactory().autowireBean(commandExecutor); register(commandExecutor); } - public void unregister(String name) { - PluginCommand command = getCommand(name, UltiTools.getInstance()); - command.unregister(getCommandMap()); - } - public void registerAll(UltiToolsPlugin plugin, String packageName) { Set> classes = PackageScanUtils.scanAnnotatedClasses( CmdExecutor.class, @@ -60,6 +104,44 @@ public class CommandManager { } } + public void registerAll(UltiToolsPlugin plugin) { + for (String cmdBean : plugin.getContext().getBeanNamesForType(CommandExecutor.class)) { + CommandExecutor commandExecutor = plugin.getContext().getBean(cmdBean, CommandExecutor.class); + if (commandExecutor.getClass().getAnnotation(CmdExecutor.class).manualRegister()) continue; + register(plugin, commandExecutor); + } + } + + public void unregister(String name) { + PluginCommand command = getCommand(name, UltiTools.getInstance()); + command.unregister(getCommandMap()); + } + + public void unregisterAll(UltiToolsPlugin plugin) { + List commands = commandListMap.get(plugin); + if (commands == null) return; + for (Command command : commands) { + unregister(command.getName()); + } + } + + public void close() { + for (UltiToolsPlugin plugin : commandListMap.keySet()) { + unregisterAll(plugin); + } + } + + @Deprecated + public void register(CommandExecutor commandExecutor, String permission, String description, String... aliases) { + PluginCommand command = getCommand(aliases[0], UltiTools.getInstance()); + command.setAliases(Arrays.asList(aliases)); + command.setPermission(permission); + command.setDescription(description); + getCommandMap().register(UltiTools.getInstance().getDescription().getName(), command); + command.setExecutor(commandExecutor); + } + + @Deprecated public void register(CommandExecutor commandExecutor) { Class clazz = commandExecutor.getClass(); diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/DataStoreManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/DataStoreManager.java index 46a14f0..eeb5366 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/DataStoreManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/DataStoreManager.java @@ -23,7 +23,7 @@ public class DataStoreManager { } public static void close() { - Bukkit.getLogger().log(Level.INFO, "Unregistering all data operators..."); + Bukkit.getLogger().log(Level.INFO, "[UltiTools-API] Unregistering all data operators..."); for (DataStore dataStore : dataMap.values()) { dataStore.destroyAllOperators(); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java index 5f2200b..19d4b0b 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/ListenerManager.java @@ -14,6 +14,12 @@ import java.util.*; public class ListenerManager { private final Map> listenerListMap = new HashMap<>(); + public void register(UltiToolsPlugin plugin, Class listenerClass) { + Listener listener = plugin.getContext().getBean(listenerClass); + register(plugin, listener); + } + + @Deprecated public void register(UltiToolsPlugin plugin, Listener listener) { listenerListMap.computeIfAbsent(plugin, k -> new ArrayList<>()); Bukkit.getServer().getPluginManager().registerEvents(listener, UltiTools.getInstance()); @@ -42,6 +48,14 @@ public class ListenerManager { } } + public void registerAll(UltiToolsPlugin plugin) { + for (String listenerBean : plugin.getContext().getBeanNamesForType(Listener.class)) { + Listener listener = plugin.getContext().getBean(listenerBean, Listener.class); + if (listener.getClass().getAnnotation(EventListener.class).manualRegister()) continue; + register(plugin, listener); + } + } + public void unregister(Listener listener) { HandlerList.unregisterAll(listener); } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java index 1e53725..98e0952 100755 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/manager/PluginManager.java @@ -9,11 +9,15 @@ import com.ultikits.ultitools.utils.CommonUtils; import lombok.Getter; import org.bukkit.Bukkit; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.core.annotation.AnnotationUtils; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; -import java.net.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.net.URLDecoder; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; @@ -29,7 +33,7 @@ public class PluginManager { public void init() throws IOException { String currentPath = System.getProperty("user.dir"); - String path = currentPath+ File.separator + "plugins" + File.separator + "UltiTools" + File.separator + "plugins"; + String path = currentPath + File.separator + "plugins" + File.separator + "UltiTools" + File.separator + "plugins"; File pluginFolder = new File(path); File[] plugins = pluginFolder.listFiles((file) -> file.getName().endsWith(".jar")); @@ -80,7 +84,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin); + registerBukkit(plugin, true); } return result; } @@ -108,7 +112,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin); + registerBukkit(plugin, false); } return result; } @@ -138,7 +142,7 @@ public class PluginManager { } boolean result = invokeRegisterSelf(plugin); if (result) { - registerBukkit(plugin); + registerBukkit(plugin, false); } return result; } @@ -174,7 +178,10 @@ public class PluginManager { try { @SuppressWarnings("resource") URLClassLoader classLoader = new URLClassLoader( - new URL[]{new URL(URLDecoder.decode(pluginJar.toURI().toASCIIString(), "UTF-8"))}, + new URL[]{ + new URL(URLDecoder.decode(pluginJar.toURI().toASCIIString(), "UTF-8")), + CommonUtils.getServerJar() + }, UltiTools.getInstance().getPluginClassLoader() ); try (JarFile jarFile = new JarFile(pluginJar)) { @@ -211,6 +218,21 @@ public class PluginManager { private boolean invokeRegisterSelf(UltiToolsPlugin plugin) { + for (UltiToolsPlugin plugin1 : pluginList) { + if (!plugin1.getMainClass().equals(plugin.getMainClass())) { + continue; + } + if (plugin1.isNewerVersionThan(plugin)) { + Bukkit.getLogger().log( + Level.WARNING, + String.format("[UltiTools-API] %s load failed!There is already a new version!", plugin.getPluginName()) + ); + plugin.getContext().close(); + return false; + } else if (plugin.isNewerVersionThan(plugin1)) { + plugin1.unregisterSelf(); + } + } if (plugin.getMinUltiToolsVersion() > UltiTools.getPluginVersion()) { Bukkit.getLogger().log( Level.WARNING, @@ -221,7 +243,6 @@ public class PluginManager { } try { boolean registerSelf = plugin.registerSelf(); - registerBukkit(plugin); if (registerSelf) { pluginList.add(plugin); Bukkit.getLogger().log( @@ -244,10 +265,14 @@ public class PluginManager { } private UltiToolsPlugin initializePlugin(Class pluginClass, Object... constructorArgs) { + URLClassLoader urlClassLoader = new URLClassLoader( + new URL[]{CommonUtils.getServerJar()}, + pluginClass.getClassLoader() + ); AnnotationConfigApplicationContext pluginContext = new AnnotationConfigApplicationContext(); pluginContext.setParent(UltiTools.getInstance().getContext()); pluginContext.registerShutdownHook(); - pluginContext.setClassLoader(pluginClass.getClassLoader()); + pluginContext.setClassLoader(urlClassLoader); pluginContext.registerBean(pluginClass, constructorArgs); pluginContext.refresh(); UltiToolsPlugin plugin = pluginContext.getBean(pluginClass); @@ -257,18 +282,26 @@ public class PluginManager { return plugin; } - private void registerBukkit(UltiToolsPlugin plugin) { - if (!plugin.getClass().isAnnotationPresent(EnableAutoRegister.class)) { + private void registerBukkit(UltiToolsPlugin plugin, boolean flag) { + EnableAutoRegister annotation = AnnotationUtils.findAnnotation(plugin.getClass(), EnableAutoRegister.class); + if (annotation == null) { return; } - EnableAutoRegister annotation = plugin.getClass().getAnnotation(EnableAutoRegister.class); String[] packages = CommonUtils.getPluginPackages(plugin); for (String packageName : packages) { if (annotation.cmdExecutor()) { - UltiTools.getInstance().getCommandManager().registerAll(plugin, packageName); + if (flag) { + UltiTools.getInstance().getCommandManager().registerAll(plugin); + } else { + UltiTools.getInstance().getCommandManager().registerAll(plugin, packageName); + } } if (annotation.eventListener()) { - UltiTools.getInstance().getListenerManager().registerAll(plugin, packageName); + if (flag) { + UltiTools.getInstance().getListenerManager().registerAll(plugin); + } else { + UltiTools.getInstance().getListenerManager().registerAll(plugin, packageName); + } } } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/CommonUtils.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/CommonUtils.java index 68c6685..199e48e 100644 --- a/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/CommonUtils.java +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/CommonUtils.java @@ -6,12 +6,16 @@ import cn.hutool.json.JSONUtil; import com.ultikits.ultitools.UltiTools; import com.ultikits.ultitools.abstracts.UltiToolsPlugin; import com.ultikits.ultitools.annotations.EnableAutoRegister; +import org.bukkit.Bukkit; import org.springframework.context.annotation.ComponentScan; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.net.URL; import java.nio.charset.StandardCharsets; +import java.security.CodeSource; +import java.security.ProtectionDomain; public class CommonUtils { @@ -54,4 +58,12 @@ public class CommonUtils { return packages; } + public static URL getServerJar() { + ProtectionDomain protectionDomain = Bukkit.class.getProtectionDomain(); + CodeSource codeSource = protectionDomain.getCodeSource(); + if (codeSource == null) { + return null; + } + return codeSource.getLocation(); + } } diff --git a/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/Metrics.java b/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/Metrics.java new file mode 100644 index 0000000..f26f011 --- /dev/null +++ b/UltiTools-API/src/main/java/com/ultikits/ultitools/utils/Metrics.java @@ -0,0 +1,713 @@ +package com.ultikits.ultitools.utils; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.JsonPrimitive; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.ServicePriority; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.concurrent.Callable; +import java.util.logging.Level; +import java.util.zip.GZIPOutputStream; + +/** + * bStats collects some data for plugin authors. + *

+ * Check out https://bStats.org/ to learn more about bStats! + */ +@SuppressWarnings({"WeakerAccess", "unused"}) +public class Metrics { + + // The version of this bStats class + public static final int B_STATS_VERSION = 1; + // The url to which the data is sent + private static final String URL = "https://bStats.org/submitData/bukkit"; + // Should failed requests be logged? + private static boolean logFailedRequests; + // Should the sent data be logged? + private static boolean logSentData; + // Should the response text be logged? + private static boolean logResponseStatusText; + // The uuid of the server + private static String serverUUID; + + static { + // You can use the property to disable the check in your test environment + if (System.getProperty("bstats.relocatecheck") == null || !System.getProperty("bstats.relocatecheck").equals("false")) { + // Maven's Relocate is clever and changes strings, too. So we have to use this little "trick" ... :D + final String defaultPackage = new String( + new byte[]{'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's', '.', 'b', 'u', 'k', 'k', 'i', 't'}); + final String examplePackage = new String(new byte[]{'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'}); + } + } + + // The plugin + private final Plugin plugin; + // The plugin id + private final int pluginId; + // A list with all custom charts + private final List charts = new ArrayList<>(); + // Is bStats enabled on this server? + private boolean enabled; + + /** + * Class constructor. + * + * @param plugin The plugin which stats should be submitted. + * @param pluginId The id of the plugin. + * It can be found at What is my plugin id? + */ + public Metrics(Plugin plugin, int pluginId) { + if (plugin == null) { + throw new IllegalArgumentException("Plugin cannot be null!"); + } + this.plugin = plugin; + this.pluginId = pluginId; + + // Get the config file + File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats"); + File configFile = new File(bStatsFolder, "config.yml"); + YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile); + + // Check if the config file exists + if (!config.isSet("serverUuid")) { + + // Add default values + config.addDefault("enabled", true); + // Every server gets it's unique random id. + config.addDefault("serverUuid", UUID.randomUUID().toString()); + // Should failed request be logged? + config.addDefault("logFailedRequests", false); + // Should the sent data be logged? + config.addDefault("logSentData", false); + // Should the response text be logged? + config.addDefault("logResponseStatusText", false); + + // Inform the server owners about bStats + config.options().header( + "bStats collects some data for plugin authors like how many servers are using their plugins.\n" + + "To honor their work, you should not disable it.\n" + + "This has nearly no effect on the server performance!\n" + + "Check out https://bStats.org/ to learn more :)" + ).copyDefaults(true); + try { + config.save(configFile); + } catch (IOException ignored) { + } + } + + // Load the data + enabled = config.getBoolean("enabled", true); + serverUUID = config.getString("serverUuid"); + logFailedRequests = config.getBoolean("logFailedRequests", false); + logSentData = config.getBoolean("logSentData", false); + logResponseStatusText = config.getBoolean("logResponseStatusText", false); + + if (enabled) { + boolean found = false; + // Search for all other bStats Metrics classes to see if we are the first one + for (Class service : Bukkit.getServicesManager().getKnownServices()) { + try { + service.getField("B_STATS_VERSION"); // Our identifier :) + found = true; // We aren't the first + break; + } catch (NoSuchFieldException ignored) { + } + } + // Register our service + Bukkit.getServicesManager().register(Metrics.class, this, plugin, ServicePriority.Normal); + if (!found) { + // We are the first! + startSubmitting(); + } + } + } + + /** + * Sends the data to the bStats server. + * + * @param plugin Any plugin. It's just used to get a logger instance. + * @param data The data to send. + * @throws Exception If the request failed. + */ + private static void sendData(Plugin plugin, JsonObject data) throws Exception { + if (data == null) { + throw new IllegalArgumentException("Data cannot be null!"); + } + if (Bukkit.isPrimaryThread()) { + throw new IllegalAccessException("This method must not be called from the main thread!"); + } + if (logSentData) { + plugin.getLogger().info("Sending data to bStats: " + data); + } + HttpsURLConnection connection = (HttpsURLConnection) new URL(URL).openConnection(); + + // Compress the data to save bandwidth + byte[] compressedData = compress(data.toString()); + + // Add headers + connection.setRequestMethod("POST"); + connection.addRequestProperty("Accept", "application/json"); + connection.addRequestProperty("Connection", "close"); + connection.addRequestProperty("Content-Encoding", "gzip"); // We gzip our request + connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length)); + connection.setRequestProperty("Content-Type", "application/json"); // We send our data in JSON format + connection.setRequestProperty("User-Agent", "MC-Server/" + B_STATS_VERSION); + + // Send data + connection.setDoOutput(true); + try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) { + outputStream.write(compressedData); + } + + StringBuilder builder = new StringBuilder(); + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + String line; + while ((line = bufferedReader.readLine()) != null) { + builder.append(line); + } + } + + if (logResponseStatusText) { + plugin.getLogger().info("Sent data to bStats and received response: " + builder); + } + } + + /** + * Gzips the given String. + * + * @param str The string to gzip. + * @return The gzipped String. + * @throws IOException If the compression failed. + */ + private static byte[] compress(final String str) throws IOException { + if (str == null) { + return null; + } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) { + gzip.write(str.getBytes(StandardCharsets.UTF_8)); + } + return outputStream.toByteArray(); + } + + /** + * Checks if bStats is enabled. + * + * @return Whether bStats is enabled or not. + */ + public boolean isEnabled() { + return enabled; + } + + /** + * Adds a custom chart. + * + * @param chart The chart to add. + */ + public void addCustomChart(CustomChart chart) { + if (chart == null) { + throw new IllegalArgumentException("Chart cannot be null!"); + } + charts.add(chart); + } + + /** + * Starts the Scheduler which submits our data every 30 minutes. + */ + private void startSubmitting() { + final Timer timer = new Timer(true); // We use a timer cause the Bukkit scheduler is affected by server lags + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + if (!plugin.isEnabled()) { // Plugin was disabled + timer.cancel(); + return; + } + // Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler + // Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;) + Bukkit.getScheduler().runTask(plugin, () -> submitData()); + } + }, 1000 * 60 * 5, 1000 * 60 * 30); + // Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start + // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted! + // WARNING: Just don't do it! + } + + /** + * Gets the plugin specific data. + * This method is called using Reflection. + * + * @return The plugin specific data. + */ + public JsonObject getPluginData() { + JsonObject data = new JsonObject(); + + String pluginName = plugin.getDescription().getName(); + String pluginVersion = plugin.getDescription().getVersion(); + + data.addProperty("pluginName", pluginName); // Append the name of the plugin + data.addProperty("id", pluginId); // Append the id of the plugin + data.addProperty("pluginVersion", pluginVersion); // Append the version of the plugin + JsonArray customCharts = new JsonArray(); + for (CustomChart customChart : charts) { + // Add the data of the custom charts + JsonObject chart = customChart.getRequestJsonObject(); + if (chart == null) { // If the chart is null, we skip it + continue; + } + customCharts.add(chart); + } + data.add("customCharts", customCharts); + + return data; + } + + /** + * Gets the server specific data. + * + * @return The server specific data. + */ + private JsonObject getServerData() { + // Minecraft specific data + int playerAmount; + try { + // Around MC 1.8 the return type was changed to a collection from an array, + // This fixes java.lang.NoSuchMethodError: org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection; + Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers"); + playerAmount = onlinePlayersMethod.getReturnType().equals(Collection.class) + ? ((Collection) onlinePlayersMethod.invoke(Bukkit.getServer())).size() + : ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length; + } catch (Exception e) { + playerAmount = Bukkit.getOnlinePlayers().size(); // Just use the new method if the Reflection failed + } + int onlineMode = Bukkit.getOnlineMode() ? 1 : 0; + String bukkitVersion = Bukkit.getVersion(); + String bukkitName = Bukkit.getName(); + + // OS/Java specific data + String javaVersion = System.getProperty("java.version"); + String osName = System.getProperty("os.name"); + String osArch = System.getProperty("os.arch"); + String osVersion = System.getProperty("os.version"); + int coreCount = Runtime.getRuntime().availableProcessors(); + + JsonObject data = new JsonObject(); + + data.addProperty("serverUUID", serverUUID); + + data.addProperty("playerAmount", playerAmount); + data.addProperty("onlineMode", onlineMode); + data.addProperty("bukkitVersion", bukkitVersion); + data.addProperty("bukkitName", bukkitName); + + data.addProperty("javaVersion", javaVersion); + data.addProperty("osName", osName); + data.addProperty("osArch", osArch); + data.addProperty("osVersion", osVersion); + data.addProperty("coreCount", coreCount); + + return data; + } + + /** + * Collects the data and sends it afterwards. + */ + private void submitData() { + final JsonObject data = getServerData(); + + JsonArray pluginData = new JsonArray(); + // Search for all other bStats Metrics classes to get their plugin data + for (Class service : Bukkit.getServicesManager().getKnownServices()) { + try { + service.getField("B_STATS_VERSION"); // Our identifier :) + + for (RegisteredServiceProvider provider : Bukkit.getServicesManager().getRegistrations(service)) { + try { + Object plugin = provider.getService().getMethod("getPluginData").invoke(provider.getProvider()); + if (plugin instanceof JsonObject) { + pluginData.add((JsonObject) plugin); + } else { // old bstats version compatibility + try { + Class jsonObjectJsonSimple = Class.forName("org.json.simple.JSONObject"); + if (plugin.getClass().isAssignableFrom(jsonObjectJsonSimple)) { + Method jsonStringGetter = jsonObjectJsonSimple.getDeclaredMethod("toJSONString"); + jsonStringGetter.setAccessible(true); + String jsonString = (String) jsonStringGetter.invoke(plugin); + JsonObject object = new JsonParser().parse(jsonString).getAsJsonObject(); + pluginData.add(object); + } + } catch (ClassNotFoundException e) { + // minecraft version 1.14+ + if (logFailedRequests) { + this.plugin.getLogger().log(Level.SEVERE, "Encountered unexpected exception", e); + } + } + } + } catch (NullPointerException | NoSuchMethodException | IllegalAccessException | + InvocationTargetException ignored) { + } + } + } catch (NoSuchFieldException ignored) { + } + } + + data.add("plugins", pluginData); + + // Create a new thread for the connection to the bStats server + new Thread(() -> { + try { + // Send the data + sendData(plugin, data); + } catch (Exception e) { + // Something went wrong! :( + if (logFailedRequests) { + plugin.getLogger().log(Level.WARNING, "Could not submit plugin stats of " + plugin.getName(), e); + } + } + }).start(); + } + + /** + * Represents a custom chart. + */ + public static abstract class CustomChart { + + // The id of the chart + final String chartId; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + */ + CustomChart(String chartId) { + if (chartId == null || chartId.isEmpty()) { + throw new IllegalArgumentException("ChartId cannot be null or empty!"); + } + this.chartId = chartId; + } + + private JsonObject getRequestJsonObject() { + JsonObject chart = new JsonObject(); + chart.addProperty("chartId", chartId); + try { + JsonObject data = getChartData(); + if (data == null) { + // If the data is null we don't send the chart. + return null; + } + chart.add("data", data); + } catch (Throwable t) { + if (logFailedRequests) { + Bukkit.getLogger().log(Level.WARNING, "Failed to get data for custom chart with id " + chartId, t); + } + return null; + } + return chart; + } + + protected abstract JsonObject getChartData() throws Exception; + + } + + /** + * Represents a custom simple pie. + */ + public static class SimplePie extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimplePie(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + String value = callable.call(); + if (value == null || value.isEmpty()) { + // Null = skip the chart + return null; + } + data.addProperty("value", value); + return data; + } + } + + /** + * Represents a custom advanced pie. + */ + public static class AdvancedPie extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedPie(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + continue; // Skip this invalid + } + allSkipped = false; + values.addProperty(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + } + + /** + * Represents a custom drilldown pie. + */ + public static class DrilldownPie extends CustomChart { + + private final Callable>> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public DrilldownPie(String chartId, Callable>> callable) { + super(chartId); + this.callable = callable; + } + + @Override + public JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map> map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean reallyAllSkipped = true; + for (Map.Entry> entryValues : map.entrySet()) { + JsonObject value = new JsonObject(); + boolean allSkipped = true; + for (Map.Entry valueEntry : map.get(entryValues.getKey()).entrySet()) { + value.addProperty(valueEntry.getKey(), valueEntry.getValue()); + allSkipped = false; + } + if (!allSkipped) { + reallyAllSkipped = false; + values.add(entryValues.getKey(), value); + } + } + if (reallyAllSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + } + + /** + * Represents a custom single line chart. + */ + public static class SingleLineChart extends CustomChart { + + private final Callable callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SingleLineChart(String chartId, Callable callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + int value = callable.call(); + if (value == 0) { + // Null = skip the chart + return null; + } + data.addProperty("value", value); + return data; + } + + } + + /** + * Represents a custom multi line chart. + */ + public static class MultiLineChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public MultiLineChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() == 0) { + continue; // Skip this invalid + } + allSkipped = false; + values.addProperty(entry.getKey(), entry.getValue()); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + + } + + /** + * Represents a custom simple bar chart. + */ + public static class SimpleBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public SimpleBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + for (Map.Entry entry : map.entrySet()) { + JsonArray categoryValues = new JsonArray(); + categoryValues.add(new JsonPrimitive(entry.getValue())); + values.add(entry.getKey(), categoryValues); + } + data.add("values", values); + return data; + } + + } + + /** + * Represents a custom advanced bar chart. + */ + public static class AdvancedBarChart extends CustomChart { + + private final Callable> callable; + + /** + * Class constructor. + * + * @param chartId The id of the chart. + * @param callable The callable which is used to request the chart data. + */ + public AdvancedBarChart(String chartId, Callable> callable) { + super(chartId); + this.callable = callable; + } + + @Override + protected JsonObject getChartData() throws Exception { + JsonObject data = new JsonObject(); + JsonObject values = new JsonObject(); + Map map = callable.call(); + if (map == null || map.isEmpty()) { + // Null = skip the chart + return null; + } + boolean allSkipped = true; + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue().length == 0) { + continue; // Skip this invalid + } + allSkipped = false; + JsonArray categoryValues = new JsonArray(); + for (int categoryValue : entry.getValue()) { + categoryValues.add(new JsonPrimitive(categoryValue)); + } + values.add(entry.getKey(), categoryValues); + } + if (allSkipped) { + // Null = skip the chart + return null; + } + data.add("values", values); + return data; + } + } + +} diff --git a/UltiTools-API/src/main/resources/env.yml b/UltiTools-API/src/main/resources/env.yml index 902c489..3b17b89 100644 --- a/UltiTools-API/src/main/resources/env.yml +++ b/UltiTools-API/src/main/resources/env.yml @@ -1,38 +1,36 @@ # This file is used to store environment variables - +version: ${project.version} api-url: "https://api.v2.ultikits.com" oss-url: "https://ultitools.oss-cn-shanghai.aliyuncs.com" lib-path: "/lib/" libraries: - - "advancedslot-4.1.13.jar" - - "adventure-api-4.13.0.jar" - - "adventure-key-4.13.0.jar" - - "adventure-nbt-4.13.0.jar" - - "adventure-platform-api-4.3.0.jar" - - "adventure-platform-bukkit-4.3.0.jar" - - "adventure-platform-facet-4.3.0.jar" - - "adventure-platform-viaversion-4.3.0.jar" - - "adventure-text-serializer-bungeecord-4.3.0.jar" - - "adventure-text-serializer-gson-4.13.0.jar" - - "adventure-text-serializer-gson-legacy-impl-4.13.0.jar" - - "adventure-text-serializer-legacy-4.13.0.jar" - - "annotations-24.0.1.jar" - - "bukkit-1.13.1-R0.1-SNAPSHOT.jar" - - "bungeecord-chat-1.16-R0.4.jar" - - "checker-qual-3.12.0.jar" - - "commons-lang-2.6.jar" - - "configurablegui-4.1.13.jar" - - "core-4.1.13.jar" - - "error_prone_annotations-2.11.0.jar" + - "advancedslot-4.3.0.jar" + - "adventure-api-4.13.1.jar" + - "adventure-key-4.13.1.jar" + - "adventure-nbt-4.13.1.jar" + - "adventure-platform-api-4.3.2.jar" + - "adventure-platform-bukkit-4.3.2.jar" + - "adventure-platform-facet-4.3.2.jar" + - "adventure-platform-viaversion-4.3.2.jar" + - "adventure-text-serializer-bungeecord-4.3.2.jar" + - "adventure-text-serializer-gson-4.13.1.jar" + - "adventure-text-serializer-gson-legacy-impl-4.13.1.jar" + - "adventure-text-serializer-legacy-4.13.1.jar" + - "annotations-23.0.0.jar" + - "configurablegui-4.3.0.jar" + - "core-4.3.0.jar" - "examination-api-1.3.0.jar" - "examination-string-1.3.0.jar" - - "failureaccess-1.0.1.jar" - "fastjson-1.2.83.jar" - - "gson-2.10.jar" - - "guava-31.1-jre.jar" - - "hamcrest-core-1.1.jar" - - "hutool-all-5.8.20.jar" - - "j2objc-annotations-1.3.jar" + - "hutool-cache-5.8.25.jar" + - "hutool-core-5.8.25.jar" + - "hutool-cron-5.8.25.jar" + - "hutool-crypto-5.8.25.jar" + - "hutool-db-5.8.25.jar" + - "hutool-http-5.8.25.jar" + - "hutool-json-5.8.25.jar" + - "hutool-log-5.8.25.jar" + - "hutool-setting-5.8.25.jar" - "javax.servlet-api-3.1.0.jar" - "jetty-client-9.4.48.v20220622.jar" - "jetty-http-9.4.48.v20220622.jar" @@ -44,21 +42,12 @@ libraries: - "jetty-util-ajax-9.4.48.v20220622.jar" - "jetty-webapp-9.4.48.v20220622.jar" - "jetty-xml-9.4.48.v20220622.jar" - - "json-simple-1.1.1.jar" - - "jsr305-3.0.2.jar" - - "junit-4.10.jar" - - "listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" - - "lombok-1.18.24.jar" - - "mysql-connector-j-8.0.33.jar" - - "obliviate-invs-4.1.13.jar" + - "obliviate-invs-4.3.0.jar" - "obliviate-utils-2.0.5.jar" - - "pagination-4.1.13.jar" + - "pagination-4.3.0.jar" - "placeholder-2.0.5.jar" - - "protobuf-java-3.21.9.jar" - "slf4j-api-1.7.25.jar" - - "snakeyaml-1.33.jar" - "spark-core-2.9.4.jar" - - "spigot-api-1.19.3-R0.1-SNAPSHOT.jar" - "spring-aop-5.3.31.jar" - "spring-beans-5.3.31.jar" - "spring-context-5.3.31.jar" @@ -66,10 +55,10 @@ libraries: - "spring-expression-5.3.31.jar" - "spring-jcl-5.3.31.jar" - "string-2.0.5.jar" - - "VaultAPI-1.7.jar" + - "UniversalScheduler-0.1.6.jar" - "version-detection-2.0.5.jar" - "websocket-api-9.4.48.v20220622.jar" - "websocket-client-9.4.48.v20220622.jar" - "websocket-common-9.4.48.v20220622.jar" - "websocket-server-9.4.48.v20220622.jar" - - "websocket-servlet-9.4.48.v20220622.jar" \ No newline at end of file + - "websocket-servlet-9.4.48.v20220622.jar" diff --git a/UltiTools-API/src/main/resources/lang/en.json b/UltiTools-API/src/main/resources/lang/en.json index 5a195eb..ba07e2a 100644 --- a/UltiTools-API/src/main/resources/lang/en.json +++ b/UltiTools-API/src/main/resources/lang/en.json @@ -28,7 +28,7 @@ " 简介:": " Intro:", "======== 第%d页 ========": "======== Page %d ========", "安装失败!": "Install Failed!", - "安装成功!请重启服务器!": "Installed! Please restart the server!", + "安装成功!请重启服务器!请务必删除旧版本模块!": "Installed! Please restart the server! Please be sure to delete the old version module!", "========|插件安装帮助|========": "========|Plugin Install Help|========", "/upm list [页数] - 查看可用插件列表": "/upm list [page] - View available plugin list", "/upm install [插件] - 安装最新插件": "/upm install [plugin] - Install latest plugin", diff --git a/UltiTools-API/src/main/resources/plugin.yml b/UltiTools-API/src/main/resources/plugin.yml index 225f2ec..03990ae 100755 --- a/UltiTools-API/src/main/resources/plugin.yml +++ b/UltiTools-API/src/main/resources/plugin.yml @@ -4,5 +4,8 @@ main: com.ultikits.ultitools.UltiTools api-version: 1.13 prefix: UltiTools authors: [ wisdomme ] -load: STARTUP +load: POSTWORLD depend: [ Vault, PlaceholderAPI ] +softdepend: + - Vault + - PlaceholderAPI From 1cdee5c18d3cd73f1dfa5de12f06cd1e82cd5265 Mon Sep 17 00:00:00 2001 From: wisdommen <41609381+wisdommen@users.noreply.github.com> Date: Tue, 16 Jan 2024 20:07:52 +1100 Subject: [PATCH 29/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 46 +++++++++++----------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index ad377e3..f358cb7 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -27,7 +27,7 @@ jobs: id: version uses: avides/actions-project-version-check@v1.4.0 with: - token: ${{ secrets.RELEASE_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} file-to-check: UltiTools-API/pom.xml only-return-version: true @@ -44,11 +44,15 @@ jobs: steps: - uses: actions/checkout@v3 + - name: Get latest commit message + id: commit + run: echo "::set-output name=message::$(git log --format=%B -n 1 ${{ github.sha }})" + - name: Get Project Version from pom.xml id: version uses: avides/actions-project-version-check@v1.4.0 with: - token: ${{ secrets.RELEASE_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} file-to-check: UltiTools-API/pom.xml only-return-version: true @@ -57,47 +61,25 @@ jobs: with: name: ultitools-artifact - - name: Get Latest Merged PR - id: get-pr - uses: actions/github-script@v5 - with: - script: | - const { data: pullRequests } = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - state: 'closed', - sort: 'updated', - direction: 'desc', - per_page: 1 - }); - const mergedPR = pullRequests.find(pr => pr.merged_at); - return { - title: mergedPR.title, - body: mergedPR.body - }; - result-encoding: json - - name: Create Release id: create_release uses: actions/create-release@v1 env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: v${{ steps.version.outputs.version }} - release_name: Release ${{ steps.version.outputs.version }} - body: | - # ${{ steps.get-pr.outputs.title }} - ${{ steps.get-pr.outputs.body }} + release_name: Release v${{ steps.version.outputs.version }} + body: ${{ steps.commit.outputs.message }} draft: false prerelease: false - + - name: Upload Release Asset + id: upload-release-asset uses: actions/upload-release-asset@v1 env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: ./UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar - asset_name: UltiTools-API-${{ steps.version.outputs.version }}.jar + asset_path: UltiTools-API-${{ steps.version.outputs.version }}.jar + asset_name: UltiTools-API.jar asset_content_type: application/java-archive - From 1282dfaeefdf7b660275a5d428f28c6f3bb7a296 Mon Sep 17 00:00:00 2001 From: Ling Bao <41609381+wisdommen@users.noreply.github.com> Date: Sun, 21 Jan 2024 01:32:57 +1100 Subject: [PATCH 30/33] Update maven-ci.yml --- .github/workflows/maven-ci.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/maven-ci.yml b/.github/workflows/maven-ci.yml index f358cb7..4054488 100644 --- a/.github/workflows/maven-ci.yml +++ b/.github/workflows/maven-ci.yml @@ -37,6 +37,14 @@ jobs: name: ultitools-artifact path: UltiTools-API/target/UltiTools-API-${{ steps.version.outputs.version }}.jar + - name: Deploy Java DOC + uses: SamKirkland/FTP-Deploy-Action@v4.3.4 + with: + server: ${{ secrets.FTP_HOST }} + username: ${{ secrets.FTP_USERNAME }} + password: ${{ secrets.FTP_PASSWORD }} + local-dir: "./UltiTools-API/target/apidocs/" + release: needs: build runs-on: ubuntu-latest From c7974efe79feb45ce2b91da2d6fab3ffc452e4b5 Mon Sep 17 00:00:00 2001 From: Ling Bao <41609381+wisdommen@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:11:48 +1100 Subject: [PATCH 31/33] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 46be571..b513150 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,8 @@ UltiTools是一个高层的基础插件,包含了很多GUI和高级的玩法 希望我的插件能够帮到你的插件开发! +[详细开发文档](https://dev.ultikits.com/zh/) + ### 注解驱动的 UltiTools-API改变了插件开发的方式,通过引入注解等高级语法,让你的插件开发更加高效。 From a65e916f26948437ffdb5ec9247708edbaa1e48a Mon Sep 17 00:00:00 2001 From: Ling Bao <41609381+wisdommen@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:19:12 +1100 Subject: [PATCH 32/33] Update README.md --- README.md | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index b513150..3a4e7a3 100644 --- a/README.md +++ b/README.md @@ -35,29 +35,19 @@ - -

-## 给各位服主的介绍 +## UltiTools-API 简介 + +希望我的插件能够帮到你的插件开发! -UltiTools是一个高层的基础插件,包含了很多GUI和高级的玩法,而非仅仅所谓的“基础”。 +[详细开发文档](https://dev.ultikits.com/zh/) 插件本身的详细介绍,请看mcbbs的帖子。 [\[综合\]UltiTools —— 远程背包\|GUI登陆\|GUI邮箱\|礼包\|头显\|侧边栏~\[1.8.x-1.20.x\]](https://www.mcbbs.net/thread-1062730-1-1.html) -用户使用文档 - -[UltiTools 文档](https://doc.ultitools.ultikits.com/) - -## 给开发者的介绍 - -希望我的插件能够帮到你的插件开发! - -[详细开发文档](https://dev.ultikits.com/zh/) - ### 注解驱动的 UltiTools-API改变了插件开发的方式,通过引入注解等高级语法,让你的插件开发更加高效。 @@ -225,10 +215,7 @@ UltiTools也提供了Adventure的API。 以下是简单的快速开始
-

-快速开始 - -### 快速开始 +### 安装依赖 首先将UltiTools-API依赖加入到你的项目 @@ -331,8 +318,6 @@ public List getAllConfigs() { } ``` -
-

From 18c9eed81fe60e8e996a572fcf5e73e6b0dc2565 Mon Sep 17 00:00:00 2001 From: Ling Bao <41609381+wisdommen@users.noreply.github.com> Date: Wed, 24 Jan 2024 11:41:46 +1100 Subject: [PATCH 33/33] Update README.md --- README.md | 190 +++++++++++++++++++++++++++--------------------------- 1 file changed, 95 insertions(+), 95 deletions(-) diff --git a/README.md b/README.md index 3a4e7a3..cc365a7 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@
-| [![discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/6TVRRF47) | 👈 点击左侧按钮加入官方 Discord 服务器! | 点击右侧按钮加入官方 QQ 群! 👉 | [![discord](https://img.shields.io/badge/Tencent_QQ-EB1923?style=for-the-badge&logo=TencentQQ&logoColor=white)](https://qm.qq.com/cgi-bin/qm/qr?k=UNq3LPCmpfH2aLum7V0GmMRFBusNxqxn&jump_from=webapi) | +| [![discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/6TVRRF47) | 👈 Click to join Discord server! | 点击右侧按钮加入官方 QQ 群! 👉 | [![discord](https://img.shields.io/badge/Tencent_QQ-EB1923?style=for-the-badge&logo=TencentQQ&logoColor=white)](https://qm.qq.com/cgi-bin/qm/qr?k=UNq3LPCmpfH2aLum7V0GmMRFBusNxqxn&jump_from=webapi) | |-----------------------------------------------------------------------------------------------------------------------------------------|----------------------------|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -38,27 +38,26 @@

-## UltiTools-API 简介 +## UltiTools-API Introduction -希望我的插件能够帮到你的插件开发! +[中文文档](https://github.com/UltiKits/UltiTools-Reborn/wiki/%E4%B8%AD%E6%96%87%E4%BB%8B%E7%BB%8D) -[详细开发文档](https://dev.ultikits.com/zh/) +I hope my plugin can help with your plugin development! XD -插件本身的详细介绍,请看mcbbs的帖子。 +[Detailed Dev Documents](https://dev.ultikits.com/en/) -[\[综合\]UltiTools —— 远程背包\|GUI登陆\|GUI邮箱\|礼包\|头显\|侧边栏~\[1.8.x-1.20.x\]](https://www.mcbbs.net/thread-1062730-1-1.html) -### 注解驱动的 +### Annotation-driven -UltiTools-API改变了插件开发的方式,通过引入注解等高级语法,让你的插件开发更加高效。 +UltiTools-API has changed the way plugin development is done. By introducing advanced syntax like annotations, it makes your plugin development much more efficient. -通过使用UltiTools-API,你再也无需手动注册指令和监听器,只需要在你的指令类和监听器类上添加注解,UltiTools-API会自动帮你注册。 +With UltiTools-API, you no longer need to manually register commands and listeners. Simply add annotations to your command classes and listener classes, and UltiTools-API will automatically register them for you. -你也可以像写一个控制器一样,再也不需要为一个命令做繁琐的判断,只需要在你的指令方法上添加注解,UltiTools-API会自动帮你将指令匹配到对应的方法上。 +You can also write your commands like a controller. You no longer need to make tedious judgments for a command. Just add annotations to your command methods, and UltiTools-API will automatically match the commands to the corresponding methods. ```java @CmdTarget(CmdTarget.CmdTargetType.PLAYER) -@CmdExecutor(alias = {"lore"}, manualRegister = true, permission = "ultikits.tools.command.lore", description = "物品Lore编辑功能") +@CmdExecutor(alias = {"lore"}, manualRegister = true, permission = "ultikits.tools.command.lore", description = "Lore edit function") public class LoreCommands extends AbstractCommendExecutor { @CmdMapping(format = "add ") @@ -78,16 +77,17 @@ public class LoreCommands extends AbstractCommendExecutor { @Override protected void handleHelp(CommandSender sender) { - sender.sendMessage(ChatColor.RED + "lore add <内容>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("添加Lore")); - sender.sendMessage(ChatColor.RED + "lore delete <行数>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("删除Lore")); - sender.sendMessage(ChatColor.RED + "lore edit <行数> <内容>" + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("编辑Lore")); + sender.sendMessage(ChatColor.RED + "lore add " + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("Add Lore")); + sender.sendMessage(ChatColor.RED + "lore delete " + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("Delete Lore")); + sender.sendMessage(ChatColor.RED + "lore edit " + ChatColor.GRAY + " - " + BasicFunctions.getInstance().i18n("Edit Lore")); } } ``` -数据存储方面,UltiTools提供了Mysql和Json的封装API,让你无需考虑用户会使用哪种数据存储方式。 +In terms of data storage, UltiTools provides wrapped APIs for both MySQL and JSON, allowing you not to worry about which data storage method the users will choose. + +For example -例如 ```java @Data @Builder @@ -106,7 +106,7 @@ public class AccountEntity extends AbstractDataEntity { ``` ```java -//检查玩家账户是否存在 +// check if the player account exists public boolean playerHasAccount(UUID player, String name) { DataOperator dataOperator = UltiEconomy.getInstance().getDataOperator(AccountEntity.class); return dataOperator.exist( @@ -116,29 +116,30 @@ public boolean playerHasAccount(UUID player, String name) { } ``` -配置文件方面,UltiTools让你可以像操作对象一样读取配置文件。 +Regarding configuration files, UltiTools allows you to read the configuration files as if you were manipulating objects. + +For example -例如 ```java @Getter @Setter @ConfigEntity(path = "config/config.yml") public class EcoConfig extends AbstractConfigEntity { - @ConfigEntry(path = "useThirdPartEconomy", comment = "是否使用其他的经济插件作为基础(即仅使用本插件的银行功能)") + @ConfigEntry(path = "useThirdPartEconomy", comment = "Whether to use another economy plugin as a base (i.e., only use the bank function of this plugin)") private boolean useThirdPartEconomy = false; - @ConfigEntry(path = "enableInterest", comment = "是否开启利息") + @ConfigEntry(path = "enableInterest", comment = "Whether to enable interest") private boolean enableInterest = true; - @ConfigEntry(path = "interestRate", comment = "利率,利息 = 利率 × 本金") + @ConfigEntry(path = "interestRate", comment = "Interest rate, interest = interest rate × principal") private double interestRate = 0.0003; - @ConfigEntry(path = "interestTime", comment = "利息发放间隔(分钟)") + @ConfigEntry(path = "interestTime", comment = "Interval for interest distribution (minutes)") private int interestTime = 30; - @ConfigEntry(path = "initial_money", comment = "玩家初始货币数量") + @ConfigEntry(path = "initial_money", comment = "Initial amount of currency for players") private double initMoney = 1000; - @ConfigEntry(path = "op_operate_money", comment = "服务器管理员是否能够增减玩家货币") + @ConfigEntry(path = "op_operate_money", comment = "Whether the server administrator can increase or decrease player currency") private boolean opOperateMoney = false; - @ConfigEntry(path = "currency_name", comment = "货币名称") - private String currencyName = "金币"; - @ConfigEntry(path = "server_trade_log", comment = "是否开启服务器交易记录") + @ConfigEntry(path = "currency_name", comment = "Name of the currency") + private String currencyName = "Gold Coin"; + @ConfigEntry(path = "server_trade_log", comment = "Whether to enable server trade log") private boolean enableTradeLog = false; public EcoConfig(String configFilePath) { super(configFilePath); @@ -146,17 +147,17 @@ public class EcoConfig extends AbstractConfigEntity { } ``` ```java -// 获取经济插件的配置文件,并且读取利息率 +// Get the configuration file of the economy plugin and read the interest rate EcoConfig config = UltiEconomy.getInstance().getConfig(EcoConfig.class); -double intrestRate = config.getInterestRate(); +double interestRate = config.getInterestRate(); ``` -### IOC容器管理 +### IOC Container -UltiTools-API提供了一个Spring IOC容器,它可以帮你管理你的插件中的所有Bean,并且自动注入依赖。 +UltiTools-API provides a Spring IOC container, which can manage all the Beans in your plugin and automatically inject dependencies. ```java -// @Service将类型标记为一个Bean,UltiTools-API会自动扫描并注册 +// @Service marks the type as a Bean, and UltiTools-API will automatically scan and register it @Service public class BanPlayerService { @@ -171,55 +172,55 @@ public class BanPlayerService { ```java @CmdTarget(CmdTarget.CmdTargetType.BOTH) -@CmdExecutor(permission = "ultikits.ban.command.all", description = "封禁功能", alias = {"uban"}, manualRegister = true) +@CmdExecutor(permission = "ultikits.ban.command.all", description = "Ban function", alias = {"uban"}, manualRegister = true) public class BanCommands extends AbstractCommendExecutor { - // 使用@Autowired注解,UltiTools-API会自动注入依赖 + // Using the @Autowired annotation, UltiTools-API will automatically inject the dependency @Autowired private BanPlayerService banPlayerService; @CmdMapping(format = "unban ") public void unBanPlayer(@CmdSender CommandSender sender, @CmdParam("player") String player) { banPlayerService.unBanPlayer(Bukkit.getOfflinePlayer(player)); - sender.sendMessage(BasicFunctions.getInstance().i18n("§a解封成功")); + sender.sendMessage(BasicFunctions.getInstance().i18n("§aUnban successful")); } ... } ``` -如果你不喜欢自动注入,或者无法使用自动注入,你也可以手动获取Bean。 +If you don't like automatic injection, or can't use automatic injection, you can also manually obtain the Bean. ```java BanPlayerService banPlayerService = getContext().getBean(BanPlayerService.class); ``` -### 提供超多的现代化依赖库 +### Providing Numerous Modern Dependency Libraries -UltiTools-API提供了Hutool的部分功能,包括了大量的工具类。 +UltiTools-API offers some functionalities of Hutool, including a large number of utility classes. -[Hutool 文档](https://hutool.cn/docs/#/) +[Hutool Documentation](ttps://hutoolkit.com/docs/) -GUI界面方面,UltiTools提供了obliviate-invs的API,方便你快速的开发GUI界面。 +In terms of GUI interfaces, UltiTools provides the obliviate-invs API, facilitating rapid GUI development. [ObliviateInvs — Highly efficient modular GUI library](https://www.spigotmc.org/resources/obliviateinvs-%E2%80%94-highly-efficient-modular-gui-library.103572/) -UltiTools也提供了Adventure的API。 +UltiTools also offers the Adventure API. -[Adventure 文档](https://docs.adventure.kyori.net/) +[Adventure Documentation](https://docs.adventure.kyori.net/) -## 快速开始 +## Quick Start -更多详细文档请查看 [UltiTools API 文档](https://doc.dev.ultikits.com/) +For more detailed documentation, please refer to [UltiTools API Documentation ](https://dev.ultikits.com/en/) -以下是简单的快速开始 +Below is a simple quick start guide.
-### 安装依赖 +### Installing Dependencies -首先将UltiTools-API依赖加入到你的项目 +First, add the UltiTools-API dependency to your project. -使用Maven +Using Maven ```xml @@ -229,85 +230,84 @@ UltiTools也提供了Adventure的API。 ``` -使用Gradle +Using Gradle ```groovy implementation 'com.ultikits:UltiTools-API:{VERSION}' ``` -开始之前请在resources文件夹下新建一个plugin.yml文件,内容如下 +Before starting, please create a plugin.yml file in the resources folder with the following content: ```yaml -# 插件名称 +# Plugin name name: TestPlugin -# 插件版本 +# Plugin version version: '${project.version}' -# 插件主类 +# Plugin main class main: com.test.plugin.MyPlugin -# 插件用到的UltiTools-API版本,例如6.0.0就是600 +# UltiTools-API version used by the plugin, for example, 6.0.0 is 600 api-version: 600 -# 插件作者 +# Plugin authors authors: [ wisdomme ] ``` -新建一个config文件夹,里面可以按照你的需求放入你的插件配置文件。这些配置文件会被原封不动的放入UltiTools插件的集体配置文件夹中展示给用户。 +Create a config folder, where you can put your plugin configuration files according to your needs. These configuration files will be placed unmodified in the collective configuration folder of the UltiTools plugin for display to users. -### 简单开发 +### Simple Guide -新建一个主类继承UltiToolsPlugin,类似传统的Spigot插件,UltiTools插件也需要重写启动和关闭方法。 -但是UltiToolsPlugin增加了一个可选的```UltiToolsPlugin#reloadSelf()```方法,用于插件重载时执行。 +Create a main class extending `UltiToolsPlugin`. Similar to traditional Spigot plugins, UltiTools plugins also need to override the start and stop methods. However, `UltiToolsPlugin` adds an optional `UltiToolsPlugin#reloadSelf()` method for use during plugin reload. ```java public class MyPlugin extends UltiToolsPlugin { @Override public boolean registerSelf() { - // 插件启动时执行 + // Executes when the plugin starts return true; } @Override public void unregisterSelf() { - // 插件关闭时执行 + // Executes when the plugin shuts down } @Override public void reloadSelf() { - // 插件重载时执行 + // Executes when the plugin is reloaded } } ``` -这样就已经完成了一个什么功能都没有的UltiTools插件。然后你可以在```UltiToolsPlugin#registerSelf()```方法中注册你的监听器和指令。 +With this, you've completed an UltiTools plugin that does nothing. Then, you can register your listeners and commands in the `UltiToolsPlugin#registerSelf()` method. ```java public class MyPlugin extends UltiToolsPlugin { @Override public boolean registerSelf() { - // 注册一个Test指令,权限为permission.test,指令为test - // 无需在Plugin.yml中注册指令 - getCommandManager().register(new TestCommands(), "permission.test", "示例功能", "test"); - // 注册监听器 + // Register a Test command, with permission 'permission.test', and command 'test' + // No need to register the command in Plugin.yml + getCommandManager().register(new TestCommands(), "permission.test", "Sample Function", "test"); + // Register listeners getListenerManager().register(this, new TestListener()); return true; } } ``` -然后你可以在主类中添加你的配置文件,UltiTools会自动加载配置文件。 +Then, you can add your configuration file in the main class, and UltiTools will automatically load the configuration file. ```java public class MyPlugin extends UltiToolsPlugin { @Override public boolean registerSelf() { - // 注册一个Test指令,权限为permission.test,指令为test - // 无需在Plugin.yml中注册指令 - getCommandManager().register(new TestCommands(), "permission.test", "示例功能", "test"); - // 注册监听器 + // Register a Test command, with permission 'permission.test', and command 'test' + // No need to register the command in Plugin.yml + getCommandManager().register(new TestCommands(), "permission.test", "Sample Function", "test"); + // Register listeners getListenerManager().register(this, new TestListener()); - // 注册配置文件 + // Register configuration file getConfigManager().register(this, new TestConfig("config/config.yml")); return true; } } ``` -或者你可以重写```UltiToolsPlugin#getAllConfigs()```方法,将所有的配置文件注册放在这里。 +Alternatively, you can override the `UltiToolsPlugin#getAllConfigs()` method to register all configuration files here. ```java @Override @@ -321,40 +321,40 @@ public List getAllConfigs() {

-## WakaTime 统计 +## WakaTime Statistics
-

开发时间线统计

-点击查看统计数据 +

Development Timeline Statistics

+Click to view statistics wakatime timeline

wakatime week
-

-## 主要贡献者 -| 贡献者 | 描述 | + +## Main Contributors +| Contributor | Description | |--------------------------------------------------|-----------------------------------------| -| [@wisdommen](https://github.com/wisdommen) | 创始人,UltiKits套件作者 | -| [@qianmo2233](https://github.com/qianmo2233) | UltiTools&UltiCore开发者,UltiKits开发文档主要维护者 | -| [@Shpries](https://github.com/Shpries) | UltiTools开发者,UltiTools使用文档主要维护者 | -| [@DevilJueChen](https://github.com/DevilJueChen) | UltiKits问题&漏洞&建议反馈 | -| 拾柒 | 美工 | +| [@wisdommen](https://github.com/wisdommen) | Founder, UltiKits Author | +| [@qianmo2233](https://github.com/qianmo2233) | UltiTools & UltiCore Developer, Main Maintainer of UltiKits Development Documentation | +| [@Shpries](https://github.com/Shpries) | UltiTools Developer, Main Maintainer of UltiKits Development Documentation | +| [@DevilJueChen](https://github.com/DevilJueChen) | Feedback on UltiKits Issues, Bugs & Suggestions | +| 拾柒 | Graphic Designer | -## 发现问题?想提建议? -[点击这里提交开启一个Issue!](https://github.com/wisdommen/UltiTools/issues/new/choose) +## Found an Issue? Want to Make a Suggestion? +[Click here to submit an Issue!](https://github.com/UltiKits/UltiTools-Reborn/issues/new/choose) -## 鸣谢 +## Acknowledgments | | | |---------------------------------------------------------------------------------------------------------------------------|------------------------| -| ![wakatime](https://img.shields.io/badge/WakaTime-000000?style=for-the-badge&logo=WakaTime&logoColor=white) | 记录了我们开发途中的每一刻 | -| ![wakatime](https://img.shields.io/badge/IntelliJ_IDEA-000000.svg?style=for-the-badge&logo=intellij-idea&logoColor=white) | 地表最强 Java IDE 助力愉悦开发体验 | -| ![wakatime](https://img.shields.io/badge/ChatGPT-74aa9c?style=for-the-badge&logo=openai&logoColor=white) | 帮助解决了许多重复且枯燥的工作 | -| ![wakatime](https://img.shields.io/badge/Spring-6DB33F?style=for-the-badge&logo=spring&logoColor=white) | 为插件带来了许多黑科技 | -| ![wakatime](https://img.shields.io/badge/apache_maven-C71A36?style=for-the-badge&logo=apachemaven&logoColor=white) | 官方构建工具 | -| ![wakatime](https://img.shields.io/badge/Apache_Spark-FFFFFF?style=for-the-badge&logo=apachespark&logoColor=#E35A16) | 官方内置 HTTP 服务端 | +| ![wakatime](https://img.shields.io/badge/WakaTime-000000?style=for-the-badge&logo=WakaTime&logoColor=white) | Recorded every moment of our development journey | +| ![wakatime](https://img.shields.io/badge/IntelliJ_IDEA-000000.svg?style=for-the-badge&logo=intellij-idea&logoColor=white) | The strongest Java IDE for a pleasant development experience | +| ![wakatime](https://img.shields.io/badge/ChatGPT-74aa9c?style=for-the-badge&logo=openai&logoColor=white) | Helped solve many repetitive and tedious tasks | +| ![wakatime](https://img.shields.io/badge/Spring-6DB33F?style=for-the-badge&logo=spring&logoColor=white) | Brought many high-tech features to the plugin | +| ![wakatime](https://img.shields.io/badge/apache_maven-C71A36?style=for-the-badge&logo=apachemaven&logoColor=white) | Official build tool | +| ![wakatime](https://img.shields.io/badge/Apache_Spark-FFFFFF?style=for-the-badge&logo=apachespark&logoColor=#E35A16) | Official built-in HTTP server |