mirror of
https://github.com/CarmJos/UserPrefix.git
synced 2026-06-05 09:01:39 +08:00
Compare commits
127 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3b2eaf2519 | |||
| 75ee308174 | |||
| bed1651027 | |||
| 7dde64e699 | |||
| 9b88142676 | |||
| e0cfd87ac6 | |||
| fd764fa348 | |||
| 480cebd16a | |||
| 6cd25cf94a | |||
| 72071492b3 | |||
| b334c3476e | |||
| c94ed28b98 | |||
| 72aa4e3a82 | |||
| acc92d5fb4 | |||
| bc002f9a07 | |||
| f11749d4da | |||
| a52b703a75 | |||
| 86775cdbcd | |||
| 8951b7ac90 | |||
| 89b520b8d3 | |||
| b57ff5b2c5 | |||
| b4469f93d0 | |||
| d91dd6c7bd | |||
| ebd9f9fbfc | |||
| f5d256b5c4 | |||
| e43ce22551 | |||
| f821ab88ed | |||
| b03bb4a476 | |||
| 86326a168b | |||
| 672641259e | |||
| 5fc46eed8f | |||
| 50ded3fa11 | |||
| 951fe67117 | |||
| 442374da0a | |||
| 77a277ba58 | |||
| 1ead1a0692 | |||
| f519fa43df | |||
| da63cf8b1c | |||
| 9527e9fcbb | |||
| 5befd40706 | |||
| e1bedba01b | |||
| 5809659155 | |||
| e5013b76e0 | |||
| 6604cec136 | |||
| c7f3286d81 | |||
| 5ed6f1a301 | |||
| 9864d5a75e | |||
| 2b8a7e7545 | |||
| 25b961b913 | |||
| 8e8427a937 | |||
| 748335a962 | |||
| 1e0fd2bcd4 | |||
| 04caf2df73 | |||
| 0eba124f08 | |||
| d54349da98 | |||
| eab9b2385c | |||
| 003884d772 | |||
| 610242ff62 | |||
| 289ab87273 | |||
| 46c1c03113 | |||
| 5ddde2aa99 | |||
| 38a9b0866c | |||
| e7b5b78d66 | |||
| ca83cc63a5 | |||
| 3c19c8165f | |||
| 844f59af20 | |||
| 4d42982659 | |||
| f272456079 | |||
| 50be238b36 | |||
| b7341290ec | |||
| af59a8cb4b | |||
| 30f4ca9af1 | |||
| 61350cde57 | |||
| ba3c7d5c32 | |||
| 3b06ca8109 | |||
| 5edde945d1 | |||
| 4de8863ab6 | |||
| 3c40419437 | |||
| d18ce24841 | |||
| 0b62bcd1ef | |||
| e2aadfde23 | |||
| 4ca145dbef | |||
| 1b8d499d28 | |||
| 0c182a8ed3 | |||
| 66e2302fd0 | |||
| 824a65b21c | |||
| 2c49377c33 | |||
| a0f8382830 | |||
| 675bbe4cf2 | |||
| 3b8fd6febf | |||
| d8282b9641 | |||
| ad616e5470 | |||
| f741723204 | |||
| 54f526300a | |||
| 5a0e5b8e96 | |||
| c89a9c6ccc | |||
| e321a1ec66 | |||
| 9054161135 | |||
| 53281b80e3 | |||
| 12489fe1a8 | |||
| 7d62f68662 | |||
| 4cc50c21d5 | |||
| 0d25490d0f | |||
| a805aba42e | |||
| 2a0d6b8582 | |||
| 1ea993a31b | |||
| 8ce82ec7fd | |||
| 6fb9daa3d3 | |||
| da23eaa8fe | |||
| 36cc4bf7ce | |||
| 7cf9f3f9ee | |||
| 84bb41ab2f | |||
| 2fc2474f89 | |||
| 01a83d5c9e | |||
| f648e29ee2 | |||
| cc0122f9ba | |||
| e3c911d375 | |||
| dc14b0cd2e | |||
| a8908b6dd4 | |||
| fa9f3bc1ed | |||
| 7c2391a3b0 | |||
| cb384ca201 | |||
| bb9d672016 | |||
| 13d3d56eea | |||
| 71db4b663c | |||
| 9d601b4f75 | |||
| 9693bc6b8a |
@@ -0,0 +1,31 @@
|
|||||||
|
# UserPrefix Actions 操作
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
在 `actions` 配置节点下,可以配置多个操作,格式为 `[操作类型] {操作参数}`,例如:
|
||||||
|
|
||||||
|
- `[CHAT] HELLO %player_name%!`
|
||||||
|
- `[SOUND] ENTITY_PLAYER_LEVELUP`
|
||||||
|
|
||||||
|
## 操作类型
|
||||||
|
|
||||||
|
目前支持以下操作类型:
|
||||||
|
- `CHAT` 以玩家聊天的形式发送,若需要发送指令则添加“/”前缀
|
||||||
|
- `CONSOLE` 以后台的形式发送指令
|
||||||
|
- `MESSAGE` 向玩家发送一条消息
|
||||||
|
- `SOUND` 向玩家发送声音
|
||||||
|
- `CLOSE` 关闭当前打开的GUI
|
||||||
|
|
||||||
|
所有需要键入文本的类型均支持 [PlaceholderAPI](https://www.spigotmc.org/resources/6245/) 变量 。
|
||||||
|
|
||||||
|
## 限定点击类型
|
||||||
|
|
||||||
|
若您需要限定玩家点击的类型,如左键、右键等,则可以添加在操作类型后,以“`:`”分割,如:
|
||||||
|
|
||||||
|
- `[CLOSE:LEFT]` 代表左键点击关闭
|
||||||
|
- `[MESSAGE:MIDDLE] HELLO WORLD` 代表鼠标中间点击发送消息
|
||||||
|
|
||||||
|
详细点击类型见 [`org.bukkit.event.inventory.ClickType`](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/inventory/ClickType.html) 。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
|
|
||||||
- 使用示例
|
- 使用示例
|
||||||
- [前缀配置文件预设示例](../src/main/resources/prefixes/example-prefix.yml)
|
- [前缀配置文件预设示例](../src/main/resources/prefixes/example-prefix.yml)
|
||||||
|
- [操作(Actions)配置](ACTIONS.md)
|
||||||
|
|
||||||
## [开发文档](JAVADOC-README.md)
|
## [开发文档](JAVADOC-README.md)
|
||||||
|
|
||||||
|
|||||||
@@ -38,11 +38,11 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v1
|
uses: github/codeql-action/init@v4
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@@ -53,7 +53,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v1
|
uses: github/codeql-action/autobuild@v4
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
@@ -67,4 +67,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v1
|
uses: github/codeql-action/analyze@v4
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v6
|
||||||
- name: "Set up JDK"
|
- name: "Set up JDK"
|
||||||
uses: actions/setup-java@v2
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
java-version: '11'
|
java-version: '11'
|
||||||
distribution: 'adopt'
|
distribution: 'adopt'
|
||||||
@@ -47,7 +47,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
rm -rf docs
|
rm -rf docs
|
||||||
mkdir -vp docs
|
mkdir -vp docs
|
||||||
cp -vrf target/apidocs/* docs/
|
cp -vrf target/reports/apidocs/* docs/
|
||||||
cp -vrf .documentation/JAVADOC-README.md docs/README.md
|
cp -vrf .documentation/JAVADOC-README.md docs/README.md
|
||||||
|
|
||||||
- name: "Generate the Javadoc sitemap"
|
- name: "Generate the Javadoc sitemap"
|
||||||
@@ -87,4 +87,27 @@ jobs:
|
|||||||
- name: "Push javadocs"
|
- name: "Push javadocs"
|
||||||
run: |
|
run: |
|
||||||
cd docs
|
cd docs
|
||||||
git push origin HEAD:gh-pages --force
|
git push origin HEAD:gh-pages --force
|
||||||
|
|
||||||
|
- name: "Modrinth Publish"
|
||||||
|
id: publish-modrinth
|
||||||
|
uses: Kir-Antipov/mc-publish@v3.3
|
||||||
|
with:
|
||||||
|
modrinth-id: tLcVHCPk
|
||||||
|
modrinth-featured: true
|
||||||
|
modrinth-token: ${{ secrets.MODRINTH_TOKEN }}
|
||||||
|
files: |
|
||||||
|
asset/*.jar
|
||||||
|
loaders: |
|
||||||
|
spigot
|
||||||
|
paper
|
||||||
|
purpur
|
||||||
|
folia
|
||||||
|
bukkit
|
||||||
|
game-versions: |
|
||||||
|
>=1.8 <=1.21.8
|
||||||
|
game-version-filter: releases
|
||||||
|
java: |
|
||||||
|
8
|
||||||
|
dependencies: |
|
||||||
|
placeholderapi(recommended)
|
||||||
@@ -14,9 +14,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v6
|
||||||
- name: "Set up JDK"
|
- name: "Set up JDK"
|
||||||
uses: actions/setup-java@v2
|
uses: actions/setup-java@v5
|
||||||
with:
|
with:
|
||||||
java-version: '11'
|
java-version: '11'
|
||||||
distribution: 'adopt'
|
distribution: 'adopt'
|
||||||
@@ -37,7 +37,8 @@ jobs:
|
|||||||
cp -vrf asset/*.jar artifacts
|
cp -vrf asset/*.jar artifacts
|
||||||
|
|
||||||
- name: "Upload artifact"
|
- name: "Upload artifact"
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: Artifact
|
name: Artifact
|
||||||
path: artifacts
|
path: artifacts
|
||||||
|
include-hidden-files: true
|
||||||
+2
-2
@@ -20,8 +20,6 @@ development.
|
|||||||
|
|
||||||
> This plugin has been published on [SpigotMC](https://www.spigotmc.org/resources/userprefix.96277/) .
|
> This plugin has been published on [SpigotMC](https://www.spigotmc.org/resources/userprefix.96277/) .
|
||||||
|
|
||||||
> 本插件已在 [MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=1261503) 上发布,欢迎中文用户来这里下载。
|
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||

|

|
||||||
@@ -49,6 +47,8 @@ For development dependencies, please see [Dependencies](https://github.com/Carm
|
|||||||
- Support PlaceholderAPI variables!
|
- Support PlaceholderAPI variables!
|
||||||
- Support [Hex Color](https://www.hexcolortool.com/)! (Version 1.16 and above) `&(#Color)`
|
- Support [Hex Color](https://www.hexcolortool.com/)! (Version 1.16 and above) `&(#Color)`
|
||||||
- Example: LightSlateBlue `&(#8470FF)` 、 DarkSlateBlue `&(#483D8B)`
|
- Example: LightSlateBlue `&(#8470FF)` 、 DarkSlateBlue `&(#483D8B)`
|
||||||
|
- Support Gradient Color! (Version 1.16 and above) `&<#Color1>Message&<#Color2>`
|
||||||
|
- Example: `&<#8470FF>Hello World!&<#483D8B>`
|
||||||
|
|
||||||
## Notice
|
## Notice
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,7 @@ README LANGUAGES [ [**中文**](README.md) | [English](README-en.md) ]
|
|||||||
|
|
||||||
本插件基于Spigot实现,**理论上支持全版本**。
|
本插件基于Spigot实现,**理论上支持全版本**。
|
||||||
|
|
||||||
> 本插件已在 [MCBBS](https://www.mcbbs.net/forum.php?mod=viewthread&tid=1261503)
|
> 本插件已在 [SpigotMC](https://www.spigotmc.org/resources/userprefix-hex-color-support-all-version.96277/) 上发布。
|
||||||
> 与 [SpigotMC](https://www.spigotmc.org/resources/userprefix-hex-color-support-all-version.96277/) 上发布。
|
|
||||||
|
|
||||||
## 示例
|
## 示例
|
||||||
|
|
||||||
@@ -40,11 +39,15 @@ README LANGUAGES [ [**中文**](README.md) | [English](README-en.md) ]
|
|||||||
- TabList自动按照前缀的权重排序 (如有冲突可关掉)
|
- TabList自动按照前缀的权重排序 (如有冲突可关掉)
|
||||||
- 玩家头顶前缀显示 (如有冲突可关掉)
|
- 玩家头顶前缀显示 (如有冲突可关掉)
|
||||||
- 简单的聊天变量修改功能!(不推荐使用) `[自 v2.1.0 版本起]`
|
- 简单的聊天变量修改功能!(不推荐使用) `[自 v2.1.0 版本起]`
|
||||||
|
- 支持动态前缀内容轮换!`[自 v3.3.0 版本起]`
|
||||||
- 自动排序,且可翻页的GUI!
|
- 自动排序,且可翻页的GUI!
|
||||||
- 支持PlaceholderAPI变量!(凡支持的都可以使用,如BungeeTabListPlus)
|
- 支持PlaceholderAPI变量!(凡支持的都可以使用,如BungeeTabListPlus)
|
||||||
- 支持[Hex颜色](https://www.hexcolortool.com/)!(1.16以上版本) `[自 v1.2.3 版本起]`
|
- 支持[Hex颜色](https://www.hexcolortool.com/)!(1.16以上版本) `[自 v1.2.3 版本起]`
|
||||||
- 格式: `&(#颜色代码)`
|
- 格式: `&(#颜色代码)`
|
||||||
- 示例: LightSlateBlue `&(#8470FF)` 、 DarkSlateBlue `&(#483D8B)`
|
- 示例: LightSlateBlue `&(#8470FF)` 、 DarkSlateBlue `&(#483D8B)`
|
||||||
|
- 支持渐变色!(1.16以上版本) `[自 v1.2.3 版本起]`
|
||||||
|
- 格式: `&<#颜色代码1>消息内容&<#颜色代码2>`
|
||||||
|
- 示例: `&<#8470FF>Hello World!&<#483D8B>`
|
||||||
|
|
||||||
## 注意事项
|
## 注意事项
|
||||||
|
|
||||||
@@ -92,11 +95,11 @@ README LANGUAGES [ [**中文**](README.md) | [English](README-en.md) ]
|
|||||||
|
|
||||||
## 配置文件示例
|
## 配置文件示例
|
||||||
|
|
||||||
### 基础配置文件 ([`config.yml`](src/main/java/cc/carm/plugin/userprefix/configuration/PluginConfig.java))
|
### 基础配置文件 ([`config.yml`](src/main/java/cc/carm/plugin/userprefix/conf/PluginConfig.java))
|
||||||
|
|
||||||
将会在服务器首次启动时生成,如果您想要修改配置,请在服务器启动后打开配置文件。
|
将会在服务器首次启动时生成,如果您想要修改配置,请在服务器启动后打开配置文件。
|
||||||
|
|
||||||
### 消息配置文件 ([`messages.yml`](src/main/java/cc/carm/plugin/userprefix/configuration/PluginMessages.java))
|
### 消息配置文件 ([`messages.yml`](src/main/java/cc/carm/plugin/userprefix/conf/PluginMessages.java))
|
||||||
|
|
||||||
将会在服务器首次启动时生成,如果您想要修改配置,请在服务器启动后打开配置文件 。
|
将会在服务器首次启动时生成,如果您想要修改配置,请在服务器启动后打开配置文件 。
|
||||||
|
|
||||||
@@ -117,11 +120,10 @@ README LANGUAGES [ [**中文**](README.md) | [English](README-en.md) ]
|
|||||||
本项目由 [YourCraft(你的世界)](https://www.ycraft.cn) 团队提供长期支持与维护。
|
本项目由 [YourCraft(你的世界)](https://www.ycraft.cn) 团队提供长期支持与维护。
|
||||||

|

|
||||||
|
|
||||||
若您觉得本插件做的不错,您可以捐赠支持我!
|
若您觉得本插件做的不错,您可以捐赠支持我!感谢您成为开源项目的支持者!
|
||||||
|
|
||||||
感谢您成为开源项目的支持者!
|
Many thanks to Jetbrains for kindly providing a license for me to work on this and other open-source projects.
|
||||||
|
[](https://www.jetbrains.com/?from=https://github.com/CarmJos/UserPrefix)
|
||||||
<img height=25% width=25% src="https://raw.githubusercontent.com/CarmJos/CarmJos/main/img/donate-code.jpg" alt=""/>
|
|
||||||
|
|
||||||
## 开源协议
|
## 开源协议
|
||||||
|
|
||||||
@@ -145,4 +147,6 @@ README LANGUAGES [ [**中文**](README.md) | [English](README-en.md) ]
|
|||||||
> 协议,你必须在源代码代码中包含相应信息,以及协议本身。
|
> 协议,你必须在源代码代码中包含相应信息,以及协议本身。
|
||||||
>
|
>
|
||||||
> *以上文字来自 [五种开源协议GPL,LGPL,BSD,MIT,Apache](https://www.oschina.net/question/54100_9455) 。*
|
> *以上文字来自 [五种开源协议GPL,LGPL,BSD,MIT,Apache](https://www.oschina.net/question/54100_9455) 。*
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
## Project supported by JetBrains
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
@@ -13,13 +13,13 @@
|
|||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
|
||||||
|
|
||||||
<easyplugin.version>1.4.9</easyplugin.version>
|
<deps.easyplugin.version>1.5.14</deps.easyplugin.version>
|
||||||
<mineconfig.version>2.0.1</mineconfig.version>
|
<deps.mineconfig.version>3.1.3</deps.mineconfig.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<groupId>cc.carm.plugin</groupId>
|
<groupId>cc.carm.plugin</groupId>
|
||||||
<artifactId>userprefix</artifactId>
|
<artifactId>userprefix</artifactId>
|
||||||
<version>3.0.0</version>
|
<version>3.3.1</version>
|
||||||
|
|
||||||
<name>UserPrefix</name>
|
<name>UserPrefix</name>
|
||||||
<description>轻便、高效、实时的用户前缀系统。</description>
|
<description>轻便、高效、实时的用户前缀系统。</description>
|
||||||
@@ -61,6 +61,16 @@
|
|||||||
|
|
||||||
<repositories>
|
<repositories>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>maven-central</id>
|
||||||
|
<url>https://repo1.maven.org/maven2/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
|
<repository>
|
||||||
|
<id>sonatype</id>
|
||||||
|
<url>https://oss.sonatype.org/content/repositories/public/</url>
|
||||||
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>spigot-repo</id>
|
<id>spigot-repo</id>
|
||||||
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
|
||||||
@@ -72,13 +82,9 @@
|
|||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
<id>maven-central</id>
|
<id>minecraft-libraries</id>
|
||||||
<url>https://repo1.maven.org/maven2/</url>
|
<name>Minecraft Libraries</name>
|
||||||
</repository>
|
<url>https://libraries.minecraft.net/</url>
|
||||||
|
|
||||||
<repository>
|
|
||||||
<id>sonatype-repo</id>
|
|
||||||
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
|
|
||||||
</repository>
|
</repository>
|
||||||
|
|
||||||
<repository>
|
<repository>
|
||||||
@@ -108,7 +114,15 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>easyplugin-main</artifactId>
|
<artifactId>easyplugin-main</artifactId>
|
||||||
<version>${easyplugin.version}</version>
|
<version>${deps.easyplugin.version}</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>cc.carm.lib</groupId>
|
||||||
|
<artifactId>easyplugin-command</artifactId>
|
||||||
|
<version>${deps.easyplugin.version}</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
@@ -116,15 +130,24 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>easyplugin-gui</artifactId>
|
<artifactId>easyplugin-gui</artifactId>
|
||||||
<version>${easyplugin.version}</version>
|
<version>${deps.easyplugin.version}</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!--suppress VulnerableLibrariesLocal -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>cc.carm.lib</groupId>
|
||||||
|
<artifactId>easyplugin-githubchecker</artifactId>
|
||||||
|
<version>${deps.easyplugin.version}</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>easyplugin-githubchecker</artifactId>
|
<artifactId>easyplugin-placeholderapi</artifactId>
|
||||||
<version>${easyplugin.version}</version>
|
<version>${deps.easyplugin.version}</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
@@ -132,43 +155,68 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>mineconfiguration-bukkit</artifactId>
|
<artifactId>mineconfiguration-bukkit</artifactId>
|
||||||
<version>${mineconfig.version}</version>
|
<version>${deps.mineconfig.version}</version>
|
||||||
|
<scope>compile</scope>
|
||||||
|
<optional>true</optional>
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>com.cryptomorin.xseries</groupId>
|
||||||
|
<artifactId>XSeries</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>com.github.cryptomorin</groupId>
|
||||||
|
<artifactId>XSeries</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.cryptomorin</groupId>
|
||||||
|
<artifactId>XSeries</artifactId>
|
||||||
|
<version>13.8.0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
<optional>true</optional>
|
<optional>true</optional>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.mojang</groupId>
|
||||||
|
<artifactId>authlib</artifactId>
|
||||||
|
<version>6.0.54</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.spigotmc</groupId>
|
<groupId>org.spigotmc</groupId>
|
||||||
<artifactId>spigot-api</artifactId>
|
<artifactId>spigot-api</artifactId>
|
||||||
<version>1.17-R0.1-SNAPSHOT</version>
|
<version>1.19-R0.1-20220725.090125-47</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>me.clip</groupId>
|
<groupId>me.clip</groupId>
|
||||||
<artifactId>placeholderapi</artifactId>
|
<artifactId>placeholderapi</artifactId>
|
||||||
<version>2.10.9</version>
|
<version>2.12.2</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.luckperms</groupId>
|
<groupId>net.luckperms</groupId>
|
||||||
<artifactId>api</artifactId>
|
<artifactId>api</artifactId>
|
||||||
<version>5.3</version>
|
<version>5.5</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.bstats</groupId>
|
<groupId>org.bstats</groupId>
|
||||||
<artifactId>bstats-bukkit</artifactId>
|
<artifactId>bstats-bukkit</artifactId>
|
||||||
<version>3.0.0</version>
|
<version>3.2.1</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.jetbrains</groupId>
|
<groupId>org.jetbrains</groupId>
|
||||||
<artifactId>annotations</artifactId>
|
<artifactId>annotations</artifactId>
|
||||||
<version>23.0.0</version>
|
<version>26.1.0</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
@@ -185,7 +233,7 @@
|
|||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-clean-plugin</artifactId>
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
<version>2.5</version>
|
<version>3.5.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<filesets>
|
<filesets>
|
||||||
<fileset>
|
<fileset>
|
||||||
@@ -205,14 +253,92 @@
|
|||||||
</filesets>
|
</filesets>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.15.0</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${project.jdk.version}</source>
|
||||||
|
<target>${project.jdk.version}</target>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<compilerArgument>-parameters</compilerArgument>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>3.5.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>3.4.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>jar-no-fork</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-shade-plugin</artifactId>
|
||||||
|
<version>3.6.2</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>shade</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<finalName>${project.name}-${project.version}</finalName>
|
||||||
|
<outputDirectory>${project.basedir}/asset/</outputDirectory>
|
||||||
|
<createDependencyReducedPom>false</createDependencyReducedPom>
|
||||||
|
<minimizeJar>true</minimizeJar>
|
||||||
|
<relocations>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.bstats</pattern>
|
||||||
|
<shadedPattern>${project.package}.bstats</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>cc.carm.lib</pattern>
|
||||||
|
<shadedPattern>${project.package}.lib</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>org.json</pattern>
|
||||||
|
<shadedPattern>${project.package}.lib.json</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
<relocation>
|
||||||
|
<pattern>com.cryptomorin.xseries</pattern>
|
||||||
|
<shadedPattern>${project.package}.lib.xseries</shadedPattern>
|
||||||
|
</relocation>
|
||||||
|
</relocations>
|
||||||
|
<filters>
|
||||||
|
<filter>
|
||||||
|
<artifact>*:*</artifact>
|
||||||
|
<excludes>
|
||||||
|
<exclude>META-INF/MANIFEST.MF</exclude>
|
||||||
|
<exclude>META-INF/*.txt</exclude>
|
||||||
|
</excludes>
|
||||||
|
</filter>
|
||||||
|
</filters>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
<version>3.2.0</version>
|
<version>3.12.0</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<classifier>javadoc</classifier>
|
<classifier>javadoc</classifier>
|
||||||
<links>
|
<links>
|
||||||
<link>https://javadoc.io/doc/org.jetbrains/annotations/</link>
|
<link>https://javadoc.io/doc/org.jetbrains/annotations/</link>
|
||||||
|
<link>https://hub.spigotmc.org/javadocs/bukkit/</link>
|
||||||
|
<link>https://carmjos.github.io/EasyPlugin/</link>
|
||||||
|
<link>https://carmjos.github.io/MineConfiguration/</link>
|
||||||
</links>
|
</links>
|
||||||
<detectJavaApiLink>true</detectJavaApiLink>
|
<detectJavaApiLink>true</detectJavaApiLink>
|
||||||
<encoding>UTF-8</encoding>
|
<encoding>UTF-8</encoding>
|
||||||
@@ -229,80 +355,10 @@
|
|||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
|
||||||
<version>3.8.1</version>
|
|
||||||
<configuration>
|
|
||||||
<source>${project.jdk.version}</source>
|
|
||||||
<target>${project.jdk.version}</target>
|
|
||||||
<encoding>UTF-8</encoding>
|
|
||||||
<compilerArgument>-parameters</compilerArgument>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
|
||||||
<version>3.2.0</version>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-source-plugin</artifactId>
|
|
||||||
<version>3.2.0</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>jar-no-fork</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-shade-plugin</artifactId>
|
|
||||||
<version>3.2.3</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<phase>package</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>shade</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
<configuration>
|
|
||||||
<finalName>${project.name}-${project.version}</finalName>
|
|
||||||
<outputDirectory>${project.basedir}/asset/</outputDirectory>
|
|
||||||
<createDependencyReducedPom>false</createDependencyReducedPom>
|
|
||||||
<relocations>
|
|
||||||
<relocation>
|
|
||||||
<pattern>org.bstats</pattern>
|
|
||||||
<shadedPattern>${project.package}.bstats</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
<relocation>
|
|
||||||
<pattern>cc.carm.lib</pattern>
|
|
||||||
<shadedPattern>${project.package}.lib</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
<relocation>
|
|
||||||
<pattern>org.json</pattern>
|
|
||||||
<shadedPattern>${project.package}.lib.json</shadedPattern>
|
|
||||||
</relocation>
|
|
||||||
</relocations>
|
|
||||||
<filters>
|
|
||||||
<filter>
|
|
||||||
<artifact>*:*</artifact>
|
|
||||||
<excludes>
|
|
||||||
<exclude>META-INF/MANIFEST.MF</exclude>
|
|
||||||
<exclude>META-INF/*.txt</exclude>
|
|
||||||
</excludes>
|
|
||||||
</filter>
|
|
||||||
</filters>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>2.22.1</version>
|
<version>3.5.6</version>
|
||||||
<configuration>
|
<configuration>
|
||||||
<useSystemClassLoader>false</useSystemClassLoader>
|
<useSystemClassLoader>false</useSystemClassLoader>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"extends": [
|
||||||
|
"config:base","mergeConfidence:all-badges"
|
||||||
|
],
|
||||||
|
"packageRules": [
|
||||||
|
{
|
||||||
|
"description": "Automerge non-major updates",
|
||||||
|
"matchUpdateTypes": ["minor", "patch"],
|
||||||
|
"automerge": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -2,19 +2,22 @@ package cc.carm.plugin.userprefix;
|
|||||||
|
|
||||||
import cc.carm.lib.easyplugin.EasyPlugin;
|
import cc.carm.lib.easyplugin.EasyPlugin;
|
||||||
import cc.carm.lib.easyplugin.gui.GUI;
|
import cc.carm.lib.easyplugin.gui.GUI;
|
||||||
|
import cc.carm.lib.easyplugin.gui.paged.AutoPagedGUI;
|
||||||
import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker;
|
import cc.carm.lib.easyplugin.updatechecker.GHUpdateChecker;
|
||||||
import cc.carm.lib.easyplugin.utils.MessageUtils;
|
import cc.carm.lib.easyplugin.utils.MessageUtils;
|
||||||
import cc.carm.plugin.userprefix.command.AdminCommand;
|
import cc.carm.plugin.userprefix.command.AdminCommand;
|
||||||
import cc.carm.plugin.userprefix.command.UserCommand;
|
import cc.carm.plugin.userprefix.command.UserCommand;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginConfig;
|
import cc.carm.plugin.userprefix.conf.PluginConfig;
|
||||||
|
import cc.carm.plugin.userprefix.folia.FoliaScheduler;
|
||||||
import cc.carm.plugin.userprefix.hooker.UserPrefixExpansion;
|
import cc.carm.plugin.userprefix.hooker.UserPrefixExpansion;
|
||||||
import cc.carm.plugin.userprefix.listener.ChatListener;
|
import cc.carm.plugin.userprefix.listener.ChatListener;
|
||||||
import cc.carm.plugin.userprefix.listener.UserListener;
|
import cc.carm.plugin.userprefix.listener.UserListener;
|
||||||
import cc.carm.plugin.userprefix.listener.processor.UserNodeUpdateProcessor;
|
import cc.carm.plugin.userprefix.listener.UserPermListener;
|
||||||
import cc.carm.plugin.userprefix.manager.ConfigManager;
|
import cc.carm.plugin.userprefix.manager.ConfigManager;
|
||||||
import cc.carm.plugin.userprefix.manager.PrefixManager;
|
import cc.carm.plugin.userprefix.manager.PrefixManager;
|
||||||
import cc.carm.plugin.userprefix.manager.ServiceManager;
|
import cc.carm.plugin.userprefix.manager.ServiceManager;
|
||||||
import cc.carm.plugin.userprefix.manager.UserManager;
|
import cc.carm.plugin.userprefix.manager.UserManager;
|
||||||
|
import cc.carm.plugin.userprefix.ui.PrefixSelectGUI;
|
||||||
import net.luckperms.api.event.user.UserDataRecalculateEvent;
|
import net.luckperms.api.event.user.UserDataRecalculateEvent;
|
||||||
import org.bstats.bukkit.Metrics;
|
import org.bstats.bukkit.Metrics;
|
||||||
import org.bstats.charts.SimplePie;
|
import org.bstats.charts.SimplePie;
|
||||||
@@ -26,6 +29,9 @@ public class Main extends EasyPlugin {
|
|||||||
|
|
||||||
private static Main instance;
|
private static Main instance;
|
||||||
|
|
||||||
|
protected FoliaScheduler foliaScheduler;
|
||||||
|
protected boolean onFolia;
|
||||||
|
|
||||||
protected ConfigManager configManager;
|
protected ConfigManager configManager;
|
||||||
protected PrefixManager prefixManager;
|
protected PrefixManager prefixManager;
|
||||||
protected UserManager userManager;
|
protected UserManager userManager;
|
||||||
@@ -34,6 +40,14 @@ public class Main extends EasyPlugin {
|
|||||||
protected boolean initialize() {
|
protected boolean initialize() {
|
||||||
instance = this;
|
instance = this;
|
||||||
|
|
||||||
|
try {
|
||||||
|
Class.forName("io.papermc.paper.threadedregions.RegionizedServer");
|
||||||
|
this.onFolia = true;
|
||||||
|
} catch (ClassNotFoundException e) {
|
||||||
|
this.onFolia = false;
|
||||||
|
}
|
||||||
|
this.foliaScheduler = new FoliaScheduler(this, this.onFolia);
|
||||||
|
|
||||||
log("加载插件配置...");
|
log("加载插件配置...");
|
||||||
this.configManager = new ConfigManager(getDataFolder());
|
this.configManager = new ConfigManager(getDataFolder());
|
||||||
this.prefixManager = new PrefixManager();
|
this.prefixManager = new PrefixManager();
|
||||||
@@ -47,20 +61,24 @@ public class Main extends EasyPlugin {
|
|||||||
|
|
||||||
log("注册指令...");
|
log("注册指令...");
|
||||||
registerCommand("UserPrefix", new UserCommand());
|
registerCommand("UserPrefix", new UserCommand());
|
||||||
registerCommand("UserPrefixAdmin", new AdminCommand());
|
registerCommand("UserPrefixAdmin", new AdminCommand(this));
|
||||||
|
|
||||||
log("注册监听器...");
|
log("注册监听器...");
|
||||||
GUI.initialize(this);
|
|
||||||
registerListener(new UserListener());
|
registerListener(new UserListener());
|
||||||
registerListener(new ChatListener());
|
registerListener(new ChatListener());
|
||||||
ServiceManager.getService().getEventBus().subscribe(
|
ServiceManager.getService().getEventBus().subscribe(
|
||||||
this, UserDataRecalculateEvent.class,
|
this, UserDataRecalculateEvent.class,
|
||||||
UserNodeUpdateProcessor::process
|
UserPermListener::process
|
||||||
);
|
);
|
||||||
|
|
||||||
|
log("初始化GUI管理器...");
|
||||||
|
GUI.initialize(this);
|
||||||
|
AutoPagedGUI.defaultNextPage = (PluginConfig.GUI.BOTTOMS.NEXT_PAGE::get);
|
||||||
|
AutoPagedGUI.defaultPreviousPage = (PluginConfig.GUI.BOTTOMS.PREV_PAGE::get);
|
||||||
|
|
||||||
if (MessageUtils.hasPlaceholderAPI()) {
|
if (MessageUtils.hasPlaceholderAPI()) {
|
||||||
log("注册变量...");
|
log("注册变量...");
|
||||||
new UserPrefixExpansion(getInstance()).register();
|
new UserPrefixExpansion(this, getName()).register();
|
||||||
} else {
|
} else {
|
||||||
log("未安装 PlaceholderAPI ,跳过变量注册...");
|
log("未安装 PlaceholderAPI ,跳过变量注册...");
|
||||||
log("若您想使用变量进行前缀的显示,请安装PlaceholderAPI!");
|
log("若您想使用变量进行前缀的显示,请安装PlaceholderAPI!");
|
||||||
@@ -81,11 +99,14 @@ public class Main extends EasyPlugin {
|
|||||||
|
|
||||||
if (PluginConfig.CHECK_UPDATE.getNotNull()) {
|
if (PluginConfig.CHECK_UPDATE.getNotNull()) {
|
||||||
log("开始检查更新...");
|
log("开始检查更新...");
|
||||||
getScheduler().runAsync(GHUpdateChecker.runner(this));
|
this.foliaScheduler.runAsync(GHUpdateChecker.runner(this));
|
||||||
} else {
|
} else {
|
||||||
log("已禁用检查更新,跳过。");
|
log("已禁用检查更新,跳过。");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull() && this.isOnFolia()) {
|
||||||
|
log("插件正运行在 Folia 服务端上,头顶前缀功能不可用");
|
||||||
|
}
|
||||||
Bukkit.getOnlinePlayers().forEach(userManager::initPlayer); // 适配热重载
|
Bukkit.getOnlinePlayers().forEach(userManager::initPlayer); // 适配热重载
|
||||||
|
|
||||||
log("&7感谢您使用 &3&lUserPrefix " + getDescription().getVersion() + "&7!");
|
log("&7感谢您使用 &3&lUserPrefix " + getDescription().getVersion() + "&7!");
|
||||||
@@ -93,6 +114,28 @@ public class Main extends EasyPlugin {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void shutdown() {
|
||||||
|
|
||||||
|
log("关闭已被打开的GUI...");
|
||||||
|
Bukkit.getOnlinePlayers().stream().filter(GUI::hasOpenedGUI).forEach(player -> {
|
||||||
|
player.closeInventory();
|
||||||
|
GUI.removeOpenedGUI(player);
|
||||||
|
PrefixSelectGUI.removeOpening(player);
|
||||||
|
});
|
||||||
|
|
||||||
|
log("&7感谢您使用 &3&lUserPrefix " + getDescription().getVersion() + "&7!");
|
||||||
|
log("&7本插件由 &b&lYourCraft &7提供长期支持与维护。");
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOnFolia() {
|
||||||
|
return this.onFolia;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FoliaScheduler getFoliaScheduler() {
|
||||||
|
return this.foliaScheduler;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isDebugging() {
|
public boolean isDebugging() {
|
||||||
return PluginConfig.DEBUG.getNotNull();
|
return PluginConfig.DEBUG.getNotNull();
|
||||||
@@ -106,7 +149,7 @@ public class Main extends EasyPlugin {
|
|||||||
getInstance().debug(message);
|
getInstance().debug(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void serve(String... message) {
|
public static void severe(String... message) {
|
||||||
getInstance().error(message);
|
getInstance().error(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package cc.carm.plugin.userprefix;
|
package cc.carm.plugin.userprefix;
|
||||||
|
|
||||||
import cc.carm.plugin.userprefix.configuration.prefix.PrefixConfig;
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
import cc.carm.plugin.userprefix.manager.ConfigManager;
|
import cc.carm.plugin.userprefix.manager.ConfigManager;
|
||||||
import cc.carm.plugin.userprefix.manager.PrefixManager;
|
import cc.carm.plugin.userprefix.manager.PrefixManager;
|
||||||
import cc.carm.plugin.userprefix.manager.UserManager;
|
import cc.carm.plugin.userprefix.manager.UserManager;
|
||||||
|
|||||||
@@ -1,63 +1,38 @@
|
|||||||
package cc.carm.plugin.userprefix.command;
|
package cc.carm.plugin.userprefix.command;
|
||||||
|
|
||||||
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
import cc.carm.lib.easyplugin.command.CommandHandler;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginMessages;
|
import cc.carm.plugin.userprefix.command.admin.ListCommand;
|
||||||
import cc.carm.plugin.userprefix.configuration.prefix.PrefixConfig;
|
import cc.carm.plugin.userprefix.command.admin.ReloadCommand;
|
||||||
import cc.carm.plugin.userprefix.ui.PrefixSelectGUI;
|
import cc.carm.plugin.userprefix.command.admin.SetCommand;
|
||||||
import org.bukkit.Bukkit;
|
import cc.carm.plugin.userprefix.conf.PluginMessages;
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandExecutor;
|
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class AdminCommand implements CommandExecutor {
|
public class AdminCommand extends CommandHandler {
|
||||||
|
|
||||||
|
|
||||||
|
public AdminCommand(@NotNull JavaPlugin plugin) {
|
||||||
|
super(plugin);
|
||||||
|
registerSubCommand(new ListCommand(this, "list", "l"));
|
||||||
|
registerSubCommand(new SetCommand(this, "set"));
|
||||||
|
registerSubCommand(new ReloadCommand(this, "reload"));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) {
|
public Void noArgs(CommandSender sender) {
|
||||||
if (args.length == 1) {
|
|
||||||
String aim = args[0];
|
|
||||||
if (aim.equalsIgnoreCase("list")) {
|
|
||||||
PluginMessages.LIST.HEADER.send(sender);
|
|
||||||
for (PrefixConfig value : UserPrefixAPI.getPrefixManager().getPrefixes().values()) {
|
|
||||||
PluginMessages.LIST.VALUE.send(sender,
|
|
||||||
value.getWeight(), value.getIdentifier(),
|
|
||||||
value.getName(), value.getPermission(),
|
|
||||||
value.getContent(), sender.getName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else if (aim.equalsIgnoreCase("reload")) {
|
|
||||||
long s1 = System.currentTimeMillis();
|
|
||||||
PrefixSelectGUI.closeAll(); // 关掉所有正在显示的前缀列表
|
|
||||||
try {
|
|
||||||
UserPrefixAPI.getConfigManager().reload(); // 重载配置文件
|
|
||||||
int num = UserPrefixAPI.getPrefixManager().loadPrefixes(); //加载重载后了的前缀配置
|
|
||||||
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
|
|
||||||
UserPrefixAPI.getUserManager().checkPrefix(onlinePlayer, false);
|
|
||||||
/*
|
|
||||||
* 这里关掉loadOthers(为其他玩家更新)了。
|
|
||||||
* 因为每个玩家更新的时候会为其他人更新自己,
|
|
||||||
* 全部走完一遍后,所有玩家都会加载最新的前缀内容。
|
|
||||||
*/
|
|
||||||
UserPrefixAPI.getUserManager().updatePrefixView(onlinePlayer, false);
|
|
||||||
}
|
|
||||||
PluginMessages.RELOAD.SUCCESS.send(sender, System.currentTimeMillis() - s1, num);
|
|
||||||
} catch (Exception e) {
|
|
||||||
PluginMessages.RELOAD.FAILED.send(sender, e.getMessage());
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return help(sender);
|
|
||||||
}
|
|
||||||
return help(sender);
|
return help(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean help(CommandSender sender) {
|
@Override
|
||||||
PluginMessages.COMMAND_USAGE.ADMIN.send(sender);
|
public Void noPermission(CommandSender sender) {
|
||||||
return true;
|
PluginMessages.COMMAND_USAGE.NO_PERM.sendTo(sender);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Void help(CommandSender sender) {
|
||||||
|
PluginMessages.COMMAND_USAGE.ADMIN.sendTo(sender);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package cc.carm.plugin.userprefix.command;
|
package cc.carm.plugin.userprefix.command;
|
||||||
|
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginMessages;
|
import cc.carm.plugin.userprefix.conf.PluginMessages;
|
||||||
import cc.carm.plugin.userprefix.ui.PrefixSelectGUI;
|
import cc.carm.plugin.userprefix.ui.PrefixSelectGUI;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
@@ -18,7 +18,7 @@ public class UserCommand implements CommandExecutor {
|
|||||||
PrefixSelectGUI.open((Player) sender);
|
PrefixSelectGUI.open((Player) sender);
|
||||||
} else {
|
} else {
|
||||||
if (strings.length != 1) {
|
if (strings.length != 1) {
|
||||||
PluginMessages.COMMAND_USAGE.CONSOLE.send(sender);
|
PluginMessages.COMMAND_USAGE.CONSOLE.sendTo(sender);
|
||||||
} else {
|
} else {
|
||||||
Player player = Bukkit.getPlayer(strings[0]);
|
Player player = Bukkit.getPlayer(strings[0]);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package cc.carm.plugin.userprefix.command.admin;
|
||||||
|
|
||||||
|
import cc.carm.lib.easyplugin.command.SubCommand;
|
||||||
|
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
||||||
|
import cc.carm.plugin.userprefix.command.AdminCommand;
|
||||||
|
import cc.carm.plugin.userprefix.conf.PluginMessages;
|
||||||
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class ListCommand extends SubCommand<AdminCommand> {
|
||||||
|
|
||||||
|
public ListCommand(@NotNull AdminCommand parent, String name, String... aliases) {
|
||||||
|
super(parent, name, aliases);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) {
|
||||||
|
PluginMessages.LIST.HEADER.sendTo(sender);
|
||||||
|
for (PrefixConfig value : UserPrefixAPI.getPrefixManager().getPrefixes().values()) {
|
||||||
|
PluginMessages.LIST.VALUE.sendTo(sender,
|
||||||
|
value.getWeight(), value.getIdentifier(),
|
||||||
|
value.getName(), Optional.ofNullable(value.getPermission()).orElse("~"),
|
||||||
|
value.getContent(sender), sender.getName()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package cc.carm.plugin.userprefix.command.admin;
|
||||||
|
|
||||||
|
import cc.carm.lib.easyplugin.command.SubCommand;
|
||||||
|
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
||||||
|
import cc.carm.plugin.userprefix.command.AdminCommand;
|
||||||
|
import cc.carm.plugin.userprefix.conf.PluginMessages;
|
||||||
|
import cc.carm.plugin.userprefix.ui.PrefixSelectGUI;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class ReloadCommand extends SubCommand<AdminCommand> {
|
||||||
|
|
||||||
|
public ReloadCommand(@NotNull AdminCommand parent, String name, String... aliases) {
|
||||||
|
super(parent, name, aliases);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) {
|
||||||
|
long s1 = System.currentTimeMillis();
|
||||||
|
PrefixSelectGUI.closeAll(); // 关掉所有正在显示的前缀列表
|
||||||
|
try {
|
||||||
|
UserPrefixAPI.getConfigManager().reload(); // 重载配置文件
|
||||||
|
int num = UserPrefixAPI.getPrefixManager().loadPrefixes(); //加载重载后了的前缀配置
|
||||||
|
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
|
||||||
|
UserPrefixAPI.getUserManager().checkPrefix(onlinePlayer, false);
|
||||||
|
/*
|
||||||
|
* 这里关掉loadOthers(为其他玩家更新)了。
|
||||||
|
* 因为每个玩家更新的时候会为其他人更新自己,
|
||||||
|
* 全部走完一遍后,所有玩家都会加载最新的前缀内容。
|
||||||
|
*/
|
||||||
|
UserPrefixAPI.getUserManager().updatePrefixView(onlinePlayer, false);
|
||||||
|
}
|
||||||
|
PluginMessages.RELOAD.SUCCESS.sendTo(sender, System.currentTimeMillis() - s1, num);
|
||||||
|
} catch (Exception e) {
|
||||||
|
PluginMessages.RELOAD.FAILED.sendTo(sender, e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package cc.carm.plugin.userprefix.command.admin;
|
||||||
|
|
||||||
|
import cc.carm.lib.easyplugin.command.SubCommand;
|
||||||
|
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
||||||
|
import cc.carm.plugin.userprefix.command.AdminCommand;
|
||||||
|
import cc.carm.plugin.userprefix.conf.PluginMessages;
|
||||||
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class SetCommand extends SubCommand<AdminCommand> {
|
||||||
|
|
||||||
|
public SetCommand(@NotNull AdminCommand parent, String name, String... aliases) {
|
||||||
|
super(parent, name, aliases);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void execute(JavaPlugin plugin, CommandSender sender, String[] args) {
|
||||||
|
if (args.length < 2) return getParent().noArgs(sender);
|
||||||
|
|
||||||
|
Player target = Bukkit.getPlayer(args[0]);
|
||||||
|
if (target == null) {
|
||||||
|
PluginMessages.NOT_ONLINE.sendTo(sender, args[0]);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PrefixConfig prefixConfig;
|
||||||
|
String prefixInput = args[1];
|
||||||
|
if (prefixInput.equalsIgnoreCase("default")) {
|
||||||
|
prefixConfig = UserPrefixAPI.getDefaultPrefix();
|
||||||
|
} else {
|
||||||
|
prefixConfig = UserPrefixAPI.getPrefixManager().getPrefix(prefixInput);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prefixConfig == null) {
|
||||||
|
PluginMessages.SET.PREFIX_NOT_FOUND.sendTo(sender, prefixInput);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!prefixConfig.checkPermission(target)) {
|
||||||
|
PluginMessages.SET.NO_PERM.sendTo(sender, target.getName(), prefixConfig.getName());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
UserPrefixAPI.getUserManager().setPrefix(target, prefixConfig, true);
|
||||||
|
PluginMessages.SET.SUCCESS.sendTo(sender, target.getName(), prefixConfig.getName());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
package cc.carm.plugin.userprefix.conf;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.Configuration;
|
||||||
|
import cc.carm.lib.configuration.adapter.ValueType;
|
||||||
|
import cc.carm.lib.configuration.annotation.ConfigPath;
|
||||||
|
import cc.carm.lib.configuration.annotation.HeaderComments;
|
||||||
|
import cc.carm.lib.configuration.value.standard.ConfiguredList;
|
||||||
|
import cc.carm.lib.configuration.value.standard.ConfiguredValue;
|
||||||
|
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredSound;
|
||||||
|
import cc.carm.lib.mineconfiguration.bukkit.value.item.ConfiguredItem;
|
||||||
|
import cc.carm.plugin.userprefix.conf.gui.GUIItems;
|
||||||
|
import cc.carm.plugin.userprefix.folia.MajorUtil;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.inventory.ItemFlag;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class PluginConfig implements Configuration {
|
||||||
|
|
||||||
|
@HeaderComments({"开发者查错模式"})
|
||||||
|
public static final ConfiguredValue<Boolean> DEBUG = ConfiguredValue.of(Boolean.class, false);
|
||||||
|
|
||||||
|
@HeaderComments({
|
||||||
|
"统计数据设定",
|
||||||
|
" 该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。",
|
||||||
|
" 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。"
|
||||||
|
})
|
||||||
|
public static final ConfiguredValue<Boolean> METRICS = ConfiguredValue.of(Boolean.class, true);
|
||||||
|
|
||||||
|
@HeaderComments({
|
||||||
|
"检查更新设定",
|
||||||
|
"该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。",
|
||||||
|
"检查更新为异步操作,绝不会影响性能与使用体验。"
|
||||||
|
})
|
||||||
|
public static final ConfiguredValue<Boolean> CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true);
|
||||||
|
|
||||||
|
@HeaderComments({"自定义存储位置设定", "可以规定到远程文件夹中去加载前缀配置"})
|
||||||
|
public static final class CUSTOM_STORAGE implements Configuration {
|
||||||
|
|
||||||
|
@HeaderComments({"是否启用自定义存储位置"})
|
||||||
|
public static final ConfiguredValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, false);
|
||||||
|
|
||||||
|
@HeaderComments({
|
||||||
|
"目标存储路径,必须指向一个文件夹。",
|
||||||
|
"默认存储位置为 “插件文件夹”/prefixes",
|
||||||
|
"支持绝对文件路径,如 \"/etc/minecraft/configurations/prefixes/\""
|
||||||
|
})
|
||||||
|
public static final ConfiguredValue<String> PATH = ConfiguredValue.of(String.class, "prefixes/");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@HeaderComments("功能设定")
|
||||||
|
public static class FUNCTIONS implements Configuration {
|
||||||
|
|
||||||
|
@ConfigPath("on-name-prefix")
|
||||||
|
@HeaderComments({"头顶与TabList前缀功能,该方法用到了玩家名计分板接口,如有冲突请关掉哦~"})
|
||||||
|
public static final class NAME_PREFIX implements Configuration {
|
||||||
|
|
||||||
|
@HeaderComments("是否开启本功能")
|
||||||
|
public static final ConfiguredValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, true);
|
||||||
|
|
||||||
|
@HeaderComments("是否按降序排列,即权重越高的前缀显示在越上面;若为false则按升序排列。")
|
||||||
|
public static final ConfiguredValue<Boolean> ORDER_DESC = ConfiguredValue.of(Boolean.class, true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@ConfigPath("auto-prefix-use")
|
||||||
|
@HeaderComments("自动使用前缀,即当玩家没有自己选择一个前缀的时候,会自动使用所拥有的的前缀中权重最高的那一个")
|
||||||
|
public static final ConfiguredValue<Boolean> AUTO_USE = ConfiguredValue.of(Boolean.class, true);
|
||||||
|
|
||||||
|
|
||||||
|
@HeaderComments({
|
||||||
|
"聊天功能设定",
|
||||||
|
"- 我不推荐使用本插件的聊天功能,而是建议使用其他的聊天插件。",
|
||||||
|
"- 本插件仅仅提供了**最基本**的格式变量支持,不包含其他任何功能。",
|
||||||
|
"- 注意聊天格式需要遵守Bukkit原格式,即不得缺失 “%1$s” 和 “%2$s” 。",
|
||||||
|
"- 本插件的聊天功能不影响其他插件对聊天事件的操作。"
|
||||||
|
})
|
||||||
|
public static final class CHAT implements Configuration {
|
||||||
|
|
||||||
|
@HeaderComments("是否开启本功能")
|
||||||
|
public static final ConfiguredValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, false);
|
||||||
|
@HeaderComments({
|
||||||
|
"聊天的格式,注意 “%1$s” 和 “%2$s” 不可缺少。",
|
||||||
|
"- %1$s -> 玩家名", "- %2$s -> 聊天内容"
|
||||||
|
})
|
||||||
|
public static final ConfiguredValue<String> FORMAT = ConfiguredValue.of(String.class, "<%1$s> %2$s");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@HeaderComments({"前缀GUI界面设定"})
|
||||||
|
public static class GUI implements Configuration {
|
||||||
|
|
||||||
|
@HeaderComments("GUI的标题")
|
||||||
|
public static final ConfiguredValue<String> TITLE = ConfiguredValue.of(String.class, "&f&l我的前缀 &8| 列表");
|
||||||
|
|
||||||
|
@HeaderComments("GUI中的基本按钮物品")
|
||||||
|
public static final class BOTTOMS implements Configuration {
|
||||||
|
|
||||||
|
@HeaderComments("前往下一页的物品 (只有存在下一页时才会显示)")
|
||||||
|
public static final ConfiguredItem NEXT_PAGE = ConfiguredItem.create()
|
||||||
|
.defaultType(Material.ARROW)
|
||||||
|
.defaultName("下一页")
|
||||||
|
.defaultLore("&7&o右键可前往最后一页哦")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
@ConfigPath("previous-page")
|
||||||
|
@HeaderComments({"前往上一页时的物品 (只有当前页不是第一页时才会显示)"})
|
||||||
|
public static final ConfiguredItem PREV_PAGE = ConfiguredItem.create()
|
||||||
|
.defaultType(Material.ARROW)
|
||||||
|
.defaultName("上一页")
|
||||||
|
.defaultLore("&7&o右键可前往第一页哦")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@HeaderComments("GUI中的其他按钮物品 (若与现有物品位置冲突,将被覆盖)")
|
||||||
|
public static final ConfiguredValue<GUIItems> ITEMS = ConfiguredValue
|
||||||
|
.builderOf(GUIItems.class).fromSection()
|
||||||
|
.defaults(GUIItems::defaults)
|
||||||
|
.serialize(GUIItems::serialize)
|
||||||
|
.parse(GUIItems::parse)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@HeaderComments({"相关的声音,留空则不播放声音", "格式为 【声音名:音量:音调】 或 【声音名:音量】 或 【声音名】"})
|
||||||
|
public static final class SOUNDS implements Configuration {
|
||||||
|
|
||||||
|
public static final ConfiguredSound GUI_OPEN = ConfiguredSound.of("BLOCK_NOTE_BLOCK_PLING", 0.5F, 0.8F);
|
||||||
|
public static final ConfiguredSound GUI_CLICK = ConfiguredSound.of("UI_BUTTON_CLICK");
|
||||||
|
public static final ConfiguredSound PREFIX_CHANGE = ConfiguredSound.of("ENTITY_VILLAGER_YES");
|
||||||
|
public static final ConfiguredSound PREFIX_EXPIRED = ConfiguredSound.of("ENTITY_VILLAGER_NO");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@HeaderComments({"默认前缀配置"})
|
||||||
|
public static final class DEFAULT_PREFIX implements Configuration {
|
||||||
|
|
||||||
|
@HeaderComments("默认前缀的显示名称,用于在消息提示中显示。")
|
||||||
|
public static final ConfiguredValue<String> NAME = ConfiguredValue.of(String.class, "默认前缀");
|
||||||
|
|
||||||
|
@HeaderComments({"默认前缀的描述信息。"})
|
||||||
|
public static final ConfiguredList<String> DESCRIPTION = ConfiguredList.builderOf(String.class).fromString()
|
||||||
|
.defaults("&7这是一个默认前缀", "&7您可以在前缀列表中选择其他前缀")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
@HeaderComments({"默认前缀的权重,默认为0。"})
|
||||||
|
public static final ConfiguredValue<Integer> WEIGHT = ConfiguredValue.of(Integer.class, 0);
|
||||||
|
|
||||||
|
@HeaderComments({"默认前缀的内容,即用于显示的实际前缀"})
|
||||||
|
public static final ConfiguredValue<List<String>> CONTENT = ConfiguredValue
|
||||||
|
.builderOf(ValueType.ofList(String.class))
|
||||||
|
.from(Object.class)
|
||||||
|
.parse(obj -> {
|
||||||
|
if (obj instanceof List<?>) {
|
||||||
|
List<?> list = (List<?>) obj;
|
||||||
|
return list.stream()
|
||||||
|
.map(Object::toString)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
} else return Collections.singletonList(String.valueOf(obj));
|
||||||
|
})
|
||||||
|
.serialize(list -> {
|
||||||
|
if (list.isEmpty()) {
|
||||||
|
return "";
|
||||||
|
} else if (list.size() == 1) {
|
||||||
|
return list.get(0);
|
||||||
|
} else {
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.defaults(Collections.singletonList("&r"))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
@HeaderComments({"默认前缀的切换周期,单位为毫秒。(小于0则表示不进行切换,等于0则代表所及选取)"})
|
||||||
|
public static final ConfiguredValue<Long> PERIOD = ConfiguredValue.of(-1L);
|
||||||
|
|
||||||
|
@HeaderComments({"选择默认前缀时执行的操作"})
|
||||||
|
public static final ConfiguredList<String> ACTIONS = ConfiguredList.builderOf(String.class).fromString()
|
||||||
|
.defaults("[CONSOLE] " + "say %player_name% 选择了默认前缀")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
@HeaderComments({"默认前缀的显示物品"})
|
||||||
|
public static final class ITEM implements Configuration {
|
||||||
|
|
||||||
|
@HeaderComments({"当未选择默认前缀时显示的物品"})
|
||||||
|
public static final ConfiguredItem NOT_USING = ConfiguredItem.create()
|
||||||
|
.defaultType(Material.NAME_TAG)
|
||||||
|
.defaultName("&f默认玩家前缀 &f(点击切换)")
|
||||||
|
.defaultLore("", "{&f&o }#description#{1,1}", "&a➥ 点击切换到该前缀")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
@HeaderComments({"当选择了默认前缀时显示的物品"})
|
||||||
|
public static final ConfiguredItem USING = ConfiguredItem.create()
|
||||||
|
.defaultType(Material.NAME_TAG)
|
||||||
|
.defaultEnchant(MajorUtil.getEnchantProtection(), 1) // 附魔改过名
|
||||||
|
.defaultFlags(ItemFlag.HIDE_ENCHANTS)
|
||||||
|
.defaultName("&f默认玩家前缀")
|
||||||
|
.defaultLore("", "{&f&o }#description#{1,1}", "&a✔ 您正在使用该前缀")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
package cc.carm.plugin.userprefix.conf;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.Configuration;
|
||||||
|
import cc.carm.lib.configuration.annotation.HeaderComments;
|
||||||
|
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessage;
|
||||||
|
|
||||||
|
public class PluginMessages implements Configuration {
|
||||||
|
|
||||||
|
public static final class COMMAND_USAGE implements Configuration {
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> CONSOLE = ConfiguredMessage.asString().defaults(
|
||||||
|
"&f请输入 &b/prefix <玩家ID> &f为指定玩家打开前缀GUI。"
|
||||||
|
).build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> ADMIN = ConfiguredMessage.asString().defaults(
|
||||||
|
"&3&l用户前缀系统 &f帮助",
|
||||||
|
"&8# &f/upa list",
|
||||||
|
"&8- &7查看当前前缀列表。",
|
||||||
|
"&8# &f/upa set &b<玩家ID> &b<前缀ID>",
|
||||||
|
"&8- &7为玩家设定指定前缀。",
|
||||||
|
"&8- &7&o注意:玩家必须拥有指定前缀的权限。",
|
||||||
|
"&8# &f/upa reload",
|
||||||
|
"&8- &7重载前缀配置。"
|
||||||
|
).build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> NO_PERM = ConfiguredMessage.asString()
|
||||||
|
.defaults("&c&l抱歉!&f但您没有权限使用该指令。")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> NOT_ONLINE = ConfiguredMessage.asString()
|
||||||
|
.defaults("&7玩家 &b%(player) &7并不在线。")
|
||||||
|
.params("player").build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> SELECTED = ConfiguredMessage.asString()
|
||||||
|
.defaults("&7您选择了 &f%(name) &7作为当前显示的前缀。")
|
||||||
|
.params("name").build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> EXPIRED = ConfiguredMessage.asString()
|
||||||
|
.defaults(
|
||||||
|
"&7您先前使用的前缀 &f%(oldName) &7已到期。",
|
||||||
|
"&7现在已为您重新调整为 &f%(newName) &7。"
|
||||||
|
).params("oldName", "newName").build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> REMOVED = ConfiguredMessage.asString()
|
||||||
|
.defaults("&7您先前使用的前缀已被移除,现在已为您重新调整为 &f%(newName) &7。")
|
||||||
|
.params("newName").build();
|
||||||
|
|
||||||
|
public static final class RELOAD implements Configuration {
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> SUCCESS = ConfiguredMessage.asString()
|
||||||
|
.defaults("&a&l重载完成!&7耗时 &f%(time)ms&7,共加载了 &b%(count) &7个前缀。")
|
||||||
|
.params("time", "count").build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> FAILED = ConfiguredMessage.asString()
|
||||||
|
.defaults("&c&l重载出错!&7错误提示为 &8“&r%(error)&8”。")
|
||||||
|
.params("error").build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class SET implements Configuration {
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> SUCCESS = ConfiguredMessage.asString()
|
||||||
|
.defaults("&a&l设置成功!&7成功设定玩家 &b%(player) &f的前缀为 &r%(prefix) &f。")
|
||||||
|
.params("player", "prefix").build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> PREFIX_NOT_FOUND = ConfiguredMessage.asString()
|
||||||
|
.defaults("&c&l无法设置!&7不存在ID为 &b%(prefix) &7的前缀。")
|
||||||
|
.params("prefix").build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> NO_PERM = ConfiguredMessage.asString()
|
||||||
|
.defaults("&c&l无法设置!&7玩家 &b%(player) &7并没有前缀 &r%(prefix) &7的前缀。")
|
||||||
|
.params("player", "prefix")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@HeaderComments("管理员使用的 “/upa list” 指令的格式")
|
||||||
|
public static final class LIST implements Configuration {
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> HEADER = ConfiguredMessage.asString()
|
||||||
|
.defaults("&3&l用户前缀系统 &f前缀列表").build();
|
||||||
|
|
||||||
|
public static final ConfiguredMessage<String> VALUE = ConfiguredMessage.asString().defaults(
|
||||||
|
"&8#%(weight) &f%(identifier)",
|
||||||
|
"&8- &7显示名 &r%(name) &7权限 &r%(permission)",
|
||||||
|
"&8- &7内容示例&r %(content) %(sender_name)"
|
||||||
|
).params("weight", "identifier", "name", "permission", "content", "sender_name").build();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package cc.carm.plugin.userprefix.conf.gui;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.source.section.ConfigureSection;
|
||||||
|
import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration;
|
||||||
|
import cc.carm.lib.easyplugin.gui.configuration.GUIActionType;
|
||||||
|
import cc.carm.lib.easyplugin.gui.configuration.GUIConfiguration;
|
||||||
|
import cc.carm.lib.easyplugin.gui.configuration.GUIItemConfiguration;
|
||||||
|
import cc.carm.lib.mineconfiguration.bukkit.source.BukkitSection;
|
||||||
|
import cc.carm.plugin.userprefix.Main;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public class GUIItems {
|
||||||
|
|
||||||
|
protected final Map<String, GUIItemConfiguration> items;
|
||||||
|
|
||||||
|
public GUIItems(Map<String, GUIItemConfiguration> items) {
|
||||||
|
this.items = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, GUIItemConfiguration> getItems() {
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Object> serialize() {
|
||||||
|
return items.entrySet().stream().collect(Collectors.toMap(
|
||||||
|
Map.Entry::getKey,
|
||||||
|
entry -> entry.getValue().serialize(), (a, b) -> b,
|
||||||
|
LinkedHashMap::new
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GUIItems parse(ConfigureSection section) {
|
||||||
|
if (!(section instanceof BukkitSection)) {
|
||||||
|
Main.severe("Unknown configure source, it should never happened!");
|
||||||
|
Main.severe("Required: " + BukkitSection.class.getSimpleName());
|
||||||
|
Main.severe("Found: " + section.getClass().getSimpleName());
|
||||||
|
return new GUIItems(new LinkedHashMap<>());
|
||||||
|
}
|
||||||
|
BukkitSection craft = (BukkitSection) section;
|
||||||
|
return new GUIItems(GUIConfiguration.readItems(craft.data()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GUIItems defaults() {
|
||||||
|
LinkedHashMap<String, GUIItemConfiguration> map = new LinkedHashMap<>();
|
||||||
|
map.put("back", new GUIItemConfiguration(
|
||||||
|
Material.BARRIER, 1, 0, "&c&l返回",
|
||||||
|
Collections.singletonList("&f点击即可返回上一菜单"),
|
||||||
|
Collections.singletonList(GUIActionConfiguration.of(GUIActionType.CHAT, "/menu")),
|
||||||
|
Collections.singletonList(49)
|
||||||
|
));
|
||||||
|
return new GUIItems(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,202 @@
|
|||||||
|
package cc.carm.plugin.userprefix.conf.prefix;
|
||||||
|
|
||||||
|
import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration;
|
||||||
|
import cc.carm.lib.easyplugin.gui.configuration.GUIActionType;
|
||||||
|
import cc.carm.lib.easyplugin.utils.ColorParser;
|
||||||
|
import cc.carm.lib.easyplugin.utils.MessageUtils;
|
||||||
|
import cc.carm.lib.mineconfiguration.bukkit.value.item.PreparedItem;
|
||||||
|
import cc.carm.plugin.userprefix.Main;
|
||||||
|
import cc.carm.plugin.userprefix.manager.ServiceManager;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.jetbrains.annotations.Contract;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class PrefixConfig {
|
||||||
|
|
||||||
|
static final Random RANDOM = new Random();
|
||||||
|
|
||||||
|
protected final @NotNull String identifier;
|
||||||
|
|
||||||
|
protected final @NotNull String name;
|
||||||
|
protected final @NotNull List<String> content;
|
||||||
|
protected final @NotNull List<String> description;
|
||||||
|
|
||||||
|
protected final long period; // 内容变更周期,单位为毫秒
|
||||||
|
|
||||||
|
protected final int weight;
|
||||||
|
|
||||||
|
protected final @Nullable String permission;
|
||||||
|
|
||||||
|
protected final @NotNull List<GUIActionConfiguration> actions;
|
||||||
|
|
||||||
|
protected final @NotNull ItemStack itemHasPermission;
|
||||||
|
protected final @Nullable ItemStack itemNoPermission;
|
||||||
|
protected final @Nullable ItemStack itemWhenUsing;
|
||||||
|
|
||||||
|
public PrefixConfig(@NotNull String identifier, @NotNull String name,
|
||||||
|
@NotNull String content, int weight, @Nullable String permission,
|
||||||
|
@NotNull List<GUIActionConfiguration> actions,
|
||||||
|
@NotNull ItemStack itemHasPermission,
|
||||||
|
@Nullable ItemStack itemWhenUsing,
|
||||||
|
@Nullable ItemStack itemNoPermission) {
|
||||||
|
this(
|
||||||
|
identifier, name, new ArrayList<>(),
|
||||||
|
content, weight, permission, actions,
|
||||||
|
itemHasPermission, itemWhenUsing, itemNoPermission
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrefixConfig(@NotNull String identifier,
|
||||||
|
@NotNull String name, @NotNull List<String> description,
|
||||||
|
@NotNull String content, int weight, @Nullable String permission,
|
||||||
|
@NotNull List<GUIActionConfiguration> actions,
|
||||||
|
@NotNull ItemStack itemHasPermission,
|
||||||
|
@Nullable ItemStack itemWhenUsing,
|
||||||
|
@Nullable ItemStack itemNoPermission) {
|
||||||
|
this(
|
||||||
|
identifier, name, description,
|
||||||
|
Collections.singletonList(content), 0, weight, permission, actions,
|
||||||
|
itemHasPermission, itemWhenUsing, itemNoPermission
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrefixConfig(@NotNull String identifier,
|
||||||
|
@NotNull String name, @NotNull List<String> description,
|
||||||
|
@NotNull List<String> content, long period,
|
||||||
|
int weight, @Nullable String permission,
|
||||||
|
@NotNull List<GUIActionConfiguration> actions,
|
||||||
|
@NotNull ItemStack itemHasPermission,
|
||||||
|
@Nullable ItemStack itemWhenUsing,
|
||||||
|
@Nullable ItemStack itemNoPermission) {
|
||||||
|
this.identifier = identifier;
|
||||||
|
this.name = name;
|
||||||
|
this.description = description;
|
||||||
|
this.content = content;
|
||||||
|
this.period = period;
|
||||||
|
this.weight = weight;
|
||||||
|
this.permission = permission;
|
||||||
|
this.actions = actions;
|
||||||
|
this.itemHasPermission = itemHasPermission;
|
||||||
|
this.itemNoPermission = itemNoPermission;
|
||||||
|
this.itemWhenUsing = itemWhenUsing;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public String getIdentifier() {
|
||||||
|
return identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public String getName() {
|
||||||
|
return ColorParser.parse(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public List<String> getDescription() {
|
||||||
|
return ColorParser.parse(description);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public String getContent(CommandSender viewer) {
|
||||||
|
if (content.isEmpty()) return "?";
|
||||||
|
if (period < 0 || content.size() == 1) {
|
||||||
|
return ColorParser.parse(MessageUtils.setPlaceholders(viewer, content.get(0)));
|
||||||
|
}
|
||||||
|
if (period == 0) {
|
||||||
|
// PERIOD 为0时,随机返回一个内容
|
||||||
|
int index = RANDOM.nextInt(content.size());
|
||||||
|
return ColorParser.parse(MessageUtils.setPlaceholders(viewer, content.get(index)));
|
||||||
|
} else {
|
||||||
|
// 可变化的内容,则基于偏移量与时间戳计算目标index
|
||||||
|
long curr = System.currentTimeMillis();
|
||||||
|
long offset = curr % period; // 计算偏移量
|
||||||
|
int index = (int) (offset / (period / content.size())); // 计算索引
|
||||||
|
return ColorParser.parse(MessageUtils.setPlaceholders(viewer, content.get(index)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWeight() {
|
||||||
|
return weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public String getPermission() {
|
||||||
|
return permission;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public ItemStack getItemHasPermission(@Nullable Player player) {
|
||||||
|
return getItem(player, this.itemHasPermission);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public ItemStack getItemNoPermission(@Nullable Player player) {
|
||||||
|
return getItem(player, this.itemNoPermission);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public ItemStack getItemWhenUsing(@Nullable Player player) {
|
||||||
|
return getItem(player, this.itemWhenUsing);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Contract("_,!null->!null")
|
||||||
|
protected @Nullable ItemStack getItem(@Nullable Player player, @Nullable ItemStack item) {
|
||||||
|
PreparedItem prepared = PreparedItem.of(item);
|
||||||
|
|
||||||
|
prepared.parser((p, s) -> ColorParser.parse(MessageUtils.setPlaceholders(p, s)));
|
||||||
|
|
||||||
|
if (!getDescription().isEmpty()) {
|
||||||
|
prepared.insert("description", getDescription());
|
||||||
|
prepared.placeholder("description", String.join("\n", getDescription()));
|
||||||
|
}
|
||||||
|
|
||||||
|
prepared.placeholder("name", getName());
|
||||||
|
prepared.placeholder("identifier", getIdentifier());
|
||||||
|
prepared.placeholder("content", getContent(player));
|
||||||
|
prepared.placeholder("permission", getPermission());
|
||||||
|
prepared.placeholder("weight", String.valueOf(getWeight()));
|
||||||
|
prepared.placeholder("hasPermission", String.valueOf(checkPermission(player)));
|
||||||
|
prepared.placeholder("public", String.valueOf(isPublic()));
|
||||||
|
prepared.placeholder("visible", String.valueOf(isVisible(player)));
|
||||||
|
|
||||||
|
return prepared.get(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isPublic() {
|
||||||
|
return getPermission() == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void executeActions(@NotNull Player player) {
|
||||||
|
this.actions.forEach(action -> {
|
||||||
|
if (action.getActionType() == GUIActionType.CONSOLE) { // 控制台执行命令必须在全局调度器中执行
|
||||||
|
Main.getInstance().getFoliaScheduler().runGlobal(false, () -> action.executeAction(player));
|
||||||
|
} else {
|
||||||
|
action.executeAction(player);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isVisible(Player player) {
|
||||||
|
return this.itemNoPermission != null || checkPermission(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断某玩家是否有权限使用该前缀
|
||||||
|
*
|
||||||
|
* @param player 玩家
|
||||||
|
* @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。
|
||||||
|
*/
|
||||||
|
public boolean checkPermission(Player player) {
|
||||||
|
return permission == null || ServiceManager.hasPermission(player, permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
package cc.carm.plugin.userprefix.configuration;
|
|
||||||
|
|
||||||
import cc.carm.lib.configuration.core.ConfigurationRoot;
|
|
||||||
import cc.carm.lib.configuration.core.annotation.ConfigPath;
|
|
||||||
import cc.carm.lib.configuration.core.annotation.HeaderComment;
|
|
||||||
import cc.carm.lib.configuration.core.value.ConfigValue;
|
|
||||||
import cc.carm.lib.configuration.core.value.type.ConfiguredValue;
|
|
||||||
import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration;
|
|
||||||
import cc.carm.lib.easyplugin.gui.configuration.GUIActionType;
|
|
||||||
import cc.carm.lib.easyplugin.gui.configuration.GUIItemConfiguration;
|
|
||||||
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredItem;
|
|
||||||
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredSound;
|
|
||||||
import cc.carm.plugin.userprefix.configuration.reader.GUIItemReader;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.enchantments.Enchantment;
|
|
||||||
import org.bukkit.inventory.ItemFlag;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
|
|
||||||
public class PluginConfig extends ConfigurationRoot {
|
|
||||||
|
|
||||||
@HeaderComment({"开发者查错模式"})
|
|
||||||
public static final ConfigValue<Boolean> DEBUG = ConfiguredValue.of(Boolean.class, false);
|
|
||||||
|
|
||||||
@HeaderComment({
|
|
||||||
"统计数据设定",
|
|
||||||
" 该选项用于帮助开发者统计插件版本与使用情况,且绝不会影响性能与使用体验。",
|
|
||||||
" 当然,您也可以选择在这里关闭,或在plugins/bStats下的配置文件中关闭。"
|
|
||||||
})
|
|
||||||
public static final ConfigValue<Boolean> METRICS = ConfiguredValue.of(Boolean.class, true);
|
|
||||||
|
|
||||||
@HeaderComment({
|
|
||||||
"检查更新设定",
|
|
||||||
"该选项用于插件判断是否要检查更新,若您不希望插件检查更新并提示您,可以选择关闭。",
|
|
||||||
"检查更新为异步操作,绝不会影响性能与使用体验。"
|
|
||||||
})
|
|
||||||
public static final ConfigValue<Boolean> CHECK_UPDATE = ConfiguredValue.of(Boolean.class, true);
|
|
||||||
|
|
||||||
@HeaderComment({"自定义存储位置设定", "可以规定到远程文件夹中去加载前缀配置"})
|
|
||||||
public static final class CUSTOM_STORAGE {
|
|
||||||
|
|
||||||
@HeaderComment({"是否启用自定义存储位置"})
|
|
||||||
public static final ConfigValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, false);
|
|
||||||
|
|
||||||
@HeaderComment({
|
|
||||||
"目标存储路径,必须指向一个文件夹。",
|
|
||||||
"默认存储位置为 “插件文件夹”/prefixes",
|
|
||||||
"支持绝对文件路径,如 \"/etc/minecraft/configurations/prefixes/\""
|
|
||||||
})
|
|
||||||
public static final ConfigValue<String> PATH = ConfiguredValue.of(String.class, "prefixes/");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@HeaderComment("功能设定")
|
|
||||||
public static class FUNCTIONS {
|
|
||||||
|
|
||||||
@ConfigPath("on-name-prefix")
|
|
||||||
@HeaderComment({"头顶与TabList前缀功能,该方法用到了玩家名计分板接口,如有冲突请关掉哦~"})
|
|
||||||
public static final class NAME_PREFIX {
|
|
||||||
|
|
||||||
@HeaderComment("是否开启本功能")
|
|
||||||
public static final ConfigValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, true);
|
|
||||||
|
|
||||||
@HeaderComment("是否按降序排列,即权重越高的前缀显示在越上面;若为false则按升序排列。")
|
|
||||||
public static final ConfigValue<Boolean> ORDER_DESC = ConfiguredValue.of(Boolean.class, true);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@ConfigPath("auto-prefix-use")
|
|
||||||
@HeaderComment("自动使用前缀,即当玩家没有自己选择一个前缀的时候,会自动使用所拥有的的前缀中权重最高的那一个")
|
|
||||||
public static final ConfigValue<Boolean> AUTO_USE = ConfiguredValue.of(Boolean.class, true);
|
|
||||||
|
|
||||||
|
|
||||||
@HeaderComment({
|
|
||||||
"聊天功能设定",
|
|
||||||
"- 我不推荐使用本插件的聊天功能,而是建议使用其他的聊天插件。",
|
|
||||||
"- 本插件仅仅提供了**最基本**的格式变量支持,不包含其他任何功能。",
|
|
||||||
"- 注意聊天格式需要遵守Bukkit原格式,即不得缺失 “%1$s” 和 “%2$s” 。",
|
|
||||||
"- 本插件的聊天功能不影响其他插件对聊天事件的操作。"
|
|
||||||
})
|
|
||||||
public static final class CHAT {
|
|
||||||
|
|
||||||
@HeaderComment("是否开启本功能")
|
|
||||||
public static ConfigValue<Boolean> ENABLE = ConfiguredValue.of(Boolean.class, false);
|
|
||||||
@HeaderComment({
|
|
||||||
"聊天的格式,注意 “%1$s” 和 “%2$s” 不可缺少。",
|
|
||||||
"- %1$s -> 玩家名", "- %2$s -> 聊天内容"
|
|
||||||
})
|
|
||||||
public static ConfigValue<String> FORMAT = ConfiguredValue.of(String.class, "<%1$s> %2$s");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@HeaderComment({"前缀GUI界面设定"})
|
|
||||||
public static class GUI {
|
|
||||||
|
|
||||||
@HeaderComment("GUI的标题")
|
|
||||||
public static final ConfigValue<String> TITLE = ConfiguredValue.of(String.class, "&f&l我的前缀 &8| 列表");
|
|
||||||
|
|
||||||
@HeaderComment("GUI中的按钮")
|
|
||||||
public static final class ITEMS {
|
|
||||||
|
|
||||||
@HeaderComment("前往下一页的物品 (只有存在下一页时才会显示)")
|
|
||||||
public static final ConfiguredItem NEXT_PAGE = ConfiguredItem.create()
|
|
||||||
.defaultType(Material.ARROW)
|
|
||||||
.defaultName("下一页")
|
|
||||||
.defaultLore("&7&o右键可前往最后一页哦")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
@ConfigPath("previous-page")
|
|
||||||
@HeaderComment({"前往上一页时的物品 (只有当前页不是第一页时才会显示)"})
|
|
||||||
public static final ConfiguredItem PREV_PAGE = ConfiguredItem.create()
|
|
||||||
.defaultType(Material.ARROW)
|
|
||||||
.defaultName("上一页")
|
|
||||||
.defaultLore("&7&o右键可前往第一页哦")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
@HeaderComment("GUI中其他的物品配置")
|
|
||||||
public static final ConfigValue<GUIItemConfiguration> BACK = ConfiguredValue.builder(GUIItemConfiguration.class)
|
|
||||||
.fromSection()
|
|
||||||
.serializeValue(GUIItemConfiguration::serialize)
|
|
||||||
.parseValue((v, d) -> GUIItemReader.readFrom(v))
|
|
||||||
.defaults(new GUIItemConfiguration(
|
|
||||||
Material.BARRIER, 0, "&c&l返回",
|
|
||||||
Collections.singletonList("&f点击即可返回上一菜单"),
|
|
||||||
Collections.singletonList(GUIActionConfiguration.of(GUIActionType.CHAT, "/menu")),
|
|
||||||
Collections.singletonList(49)
|
|
||||||
)).build();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@HeaderComment({"相关的声音,留空则不播放声音", "格式为 【声音名:音量:音调】 或 【声音名:音量】 或 【声音名】"})
|
|
||||||
public static final class SOUNDS {
|
|
||||||
|
|
||||||
public static final ConfiguredSound GUI_OPEN = ConfiguredSound.of("BLOCK_NOTE_BLOCK_PLING", 0.5F, 0.8F);
|
|
||||||
public static final ConfiguredSound GUI_CLICK = ConfiguredSound.of("UI_BUTTON_CLICK");
|
|
||||||
public static final ConfiguredSound PREFIX_CHANGE = ConfiguredSound.of("ENTITY_VILLAGER_YES");
|
|
||||||
public static final ConfiguredSound PREFIX_EXPIRED = ConfiguredSound.of("ENTITY_VILLAGER_NO");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@HeaderComment({"默认前缀配置"})
|
|
||||||
public static final class DEFAULT_PREFIX {
|
|
||||||
|
|
||||||
@HeaderComment("默认前缀的显示名称,用于在消息提示中显示。")
|
|
||||||
public static final ConfigValue<String> NAME = ConfiguredValue.of(String.class, "默认前缀");
|
|
||||||
|
|
||||||
@HeaderComment({"默认前缀的权重,默认为0。"})
|
|
||||||
public static final ConfigValue<Integer> WEIGHT = ConfiguredValue.of(Integer.class, 0);
|
|
||||||
|
|
||||||
@HeaderComment({"默认前缀的内容,即用于显示的实际前缀"})
|
|
||||||
public static final ConfigValue<String> CONTENT = ConfiguredValue.of(String.class, "&r");
|
|
||||||
|
|
||||||
@HeaderComment({"默认前缀的显示物品"})
|
|
||||||
public static final class ITEM {
|
|
||||||
|
|
||||||
@HeaderComment({"当未选择默认前缀时显示的物品"})
|
|
||||||
public static final ConfiguredItem NOT_USING = ConfiguredItem.create()
|
|
||||||
.defaultType(Material.NAME_TAG)
|
|
||||||
.defaultName("&f默认玩家前缀 &f(点击切换)")
|
|
||||||
.defaultLore("", "&a➥ 点击切换到该前缀")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
@HeaderComment({"当选择了默认前缀时显示的物品"})
|
|
||||||
public static final ConfiguredItem USING = ConfiguredItem.create()
|
|
||||||
.defaultType(Material.NAME_TAG)
|
|
||||||
.defaultEnchant(Enchantment.PROTECTION_ENVIRONMENTAL, 1)
|
|
||||||
.defaultFlags(ItemFlag.HIDE_ENCHANTS)
|
|
||||||
.defaultName("&f默认玩家前缀")
|
|
||||||
.defaultLore("", "&a✔ 您正在使用该前缀")
|
|
||||||
.build();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
package cc.carm.plugin.userprefix.configuration;
|
|
||||||
|
|
||||||
import cc.carm.lib.configuration.core.ConfigurationRoot;
|
|
||||||
import cc.carm.lib.configuration.core.annotation.HeaderComment;
|
|
||||||
import cc.carm.lib.mineconfiguration.bukkit.value.ConfiguredMessageList;
|
|
||||||
|
|
||||||
public class PluginMessages extends ConfigurationRoot {
|
|
||||||
|
|
||||||
public static final class COMMAND_USAGE {
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> CONSOLE = ConfiguredMessageList.asStrings().defaults(
|
|
||||||
"&f请输入 &b/prefix <玩家ID> &f为指定玩家打开前缀GUI。"
|
|
||||||
).build();
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> ADMIN = ConfiguredMessageList.asStrings().defaults(
|
|
||||||
"&3&l用户前缀系统 &f帮助",
|
|
||||||
"&8# &f/upa list",
|
|
||||||
"&8- &7查看当前前缀列表。",
|
|
||||||
"&8# &f/upa reload",
|
|
||||||
"&8- &7重载前缀配置。"
|
|
||||||
).build();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> SELECTED = ConfiguredMessageList.asStrings()
|
|
||||||
.defaults("&7您选择了 &f%(name) &7作为当前显示的前缀。")
|
|
||||||
.params("name").build();
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> EXPIRED = ConfiguredMessageList.asStrings()
|
|
||||||
.defaults(
|
|
||||||
"&7您先前使用的前缀 &f%(oldName) &7已到期。",
|
|
||||||
"&7现在已为您重新调整为 &f%(newName) &7。"
|
|
||||||
).params("oldName", "newName").build();
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> REMOVED = ConfiguredMessageList.asStrings()
|
|
||||||
.defaults("&7您先前使用的前缀已被移除,现在已为您重新调整为 &f%(newName) &7。")
|
|
||||||
.params("newName").build();
|
|
||||||
|
|
||||||
public static final class RELOAD {
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> SUCCESS = ConfiguredMessageList.asStrings()
|
|
||||||
.defaults("&a&l重载完成!&7耗时 &f%(time)ms&7,共加载了 &b%(count) &7个前缀。")
|
|
||||||
.params("time", "count").build();
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> FAILED = ConfiguredMessageList.asStrings()
|
|
||||||
.defaults("&c&l重载出错!&7错误提示为 &8“&r%(error)&8”。")
|
|
||||||
.params("error").build();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@HeaderComment("管理员使用的 “/upa list” 指令的格式")
|
|
||||||
public static final class LIST {
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> HEADER = ConfiguredMessageList.asStrings()
|
|
||||||
.defaults("&3&l用户前缀系统 &f前缀列表").build();
|
|
||||||
|
|
||||||
public static ConfiguredMessageList<String> VALUE = ConfiguredMessageList.asStrings().defaults(
|
|
||||||
"&8#%(weight) &f%(identifier)",
|
|
||||||
"&8- &7显示名 &r%(name) &7权限 &r%(permission)",
|
|
||||||
"&8- &7内容示例&r %(content) %(sender_name)"
|
|
||||||
).params("weight", "identifier", "name", "permission", "sender_name").build();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
package cc.carm.plugin.userprefix.configuration.prefix;
|
|
||||||
|
|
||||||
import cc.carm.lib.easyplugin.utils.ColorParser;
|
|
||||||
import cc.carm.lib.mineconfiguration.bukkit.data.ItemConfig;
|
|
||||||
import cc.carm.plugin.userprefix.manager.ServiceManager;
|
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
|
|
||||||
public class PrefixConfig {
|
|
||||||
|
|
||||||
|
|
||||||
private @Nullable File dataFile;
|
|
||||||
private @Nullable FileConfiguration configuration;
|
|
||||||
|
|
||||||
protected final @NotNull String identifier;
|
|
||||||
|
|
||||||
protected final @NotNull String name;
|
|
||||||
protected final @NotNull String content;
|
|
||||||
|
|
||||||
protected final int weight;
|
|
||||||
|
|
||||||
protected final @Nullable String permission;
|
|
||||||
|
|
||||||
protected final @NotNull ItemConfig itemHasPermission;
|
|
||||||
protected final @Nullable ItemConfig itemNoPermission;
|
|
||||||
protected final @Nullable ItemConfig itemWhenUsing;
|
|
||||||
|
|
||||||
public PrefixConfig(@NotNull String identifier, @NotNull String name,
|
|
||||||
@NotNull String content, int weight, @Nullable String permission,
|
|
||||||
@NotNull ItemConfig itemHasPermission,
|
|
||||||
@Nullable ItemConfig itemWhenUsing,
|
|
||||||
@Nullable ItemConfig itemNoPermission) {
|
|
||||||
this.identifier = identifier;
|
|
||||||
this.name = name;
|
|
||||||
this.content = content;
|
|
||||||
this.weight = weight;
|
|
||||||
this.permission = permission;
|
|
||||||
this.itemHasPermission = itemHasPermission;
|
|
||||||
this.itemNoPermission = itemNoPermission;
|
|
||||||
this.itemWhenUsing = itemWhenUsing;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public String getIdentifier() {
|
|
||||||
return identifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public String getContent() {
|
|
||||||
return ColorParser.parse(content);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getWeight() {
|
|
||||||
return weight;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public String getPermission() {
|
|
||||||
return permission;
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public ItemStack getItemHasPermission(@Nullable Player player) {
|
|
||||||
return this.itemHasPermission.getItemStack(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public ItemStack getItemNoPermission(@Nullable Player player) {
|
|
||||||
if (this.itemNoPermission == null) return null;
|
|
||||||
return this.itemNoPermission.getItemStack(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public ItemStack getItemWhenUsing(@Nullable Player player) {
|
|
||||||
if (this.itemWhenUsing == null) return getItemHasPermission(player);
|
|
||||||
else return this.itemWhenUsing.getItemStack(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isPublic() {
|
|
||||||
return getPermission() == null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isVisible(Player player) {
|
|
||||||
return this.itemWhenUsing != null || checkPermission(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 判断某玩家是否有权限使用该前缀
|
|
||||||
*
|
|
||||||
* @param player 玩家
|
|
||||||
* @return 若前缀标识不存在,则返回false;若前缀为默认前缀,或该前缀无权限,或玩家有该前缀的权限,则返回true。
|
|
||||||
*/
|
|
||||||
public boolean checkPermission(Player player) {
|
|
||||||
return permission == null || ServiceManager.hasPermission(player, permission);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
package cc.carm.plugin.userprefix.configuration.reader;
|
|
||||||
|
|
||||||
import cc.carm.lib.configuration.core.source.ConfigurationWrapper;
|
|
||||||
import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration;
|
|
||||||
import cc.carm.lib.easyplugin.gui.configuration.GUIItemConfiguration;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class GUIItemReader {
|
|
||||||
|
|
||||||
public static @Nullable GUIItemConfiguration readFrom(@Nullable ConfigurationWrapper section) {
|
|
||||||
if (section == null) return null;
|
|
||||||
String material = Optional.ofNullable(section.getString("type")).orElse("STONE");
|
|
||||||
Material type = Optional.ofNullable(Material.matchMaterial(material)).orElse(Material.STONE);
|
|
||||||
int data = section.getInt("data", 0);
|
|
||||||
String name = section.getString("name");
|
|
||||||
List<String> lore = section.getStringList("lore");
|
|
||||||
|
|
||||||
List<Integer> slots = section.getIntegerList("slots");
|
|
||||||
int slot = section.getInt("slot", 0);
|
|
||||||
|
|
||||||
List<String> actionsString = section.getStringList("actions");
|
|
||||||
List<GUIActionConfiguration> actions = new ArrayList<>();
|
|
||||||
for (String actionString : actionsString) {
|
|
||||||
GUIActionConfiguration action = GUIActionConfiguration.deserialize(actionString);
|
|
||||||
if (action == null) continue;
|
|
||||||
actions.add(action);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new GUIItemConfiguration(
|
|
||||||
type, data, name, lore, actions,
|
|
||||||
slots.size() > 0 ? slots : Collections.singletonList(slot)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
package cc.carm.plugin.userprefix.event;
|
package cc.carm.plugin.userprefix.event;
|
||||||
|
|
||||||
import cc.carm.plugin.userprefix.Main;
|
import cc.carm.plugin.userprefix.Main;
|
||||||
import cc.carm.plugin.userprefix.configuration.prefix.PrefixConfig;
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Cancellable;
|
import org.bukkit.event.Cancellable;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
@@ -61,8 +62,11 @@ public class UserPrefixChangeEvent extends UserPrefixEvent implements Cancellabl
|
|||||||
@Nullable PrefixConfig before,
|
@Nullable PrefixConfig before,
|
||||||
@NotNull PrefixConfig after,
|
@NotNull PrefixConfig after,
|
||||||
@Nullable Consumer<@Nullable PrefixConfig> finish) {
|
@Nullable Consumer<@Nullable PrefixConfig> finish) {
|
||||||
Main.getInstance().callSync(new UserPrefixChangeEvent(who, before, after))
|
UserPrefixChangeEvent event = new UserPrefixChangeEvent(who, before, after);
|
||||||
.thenAccept((e) -> Optional.ofNullable(finish).ifPresent(f -> f.accept(e.getAfter())));
|
Main.getInstance().getFoliaScheduler().runGlobal(true, () -> {
|
||||||
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
Optional.ofNullable(finish).ifPresent(f -> f.accept(event.getAfter()));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
package cc.carm.plugin.userprefix.event;
|
package cc.carm.plugin.userprefix.event;
|
||||||
|
|
||||||
import cc.carm.plugin.userprefix.Main;
|
import cc.carm.plugin.userprefix.Main;
|
||||||
import cc.carm.plugin.userprefix.configuration.prefix.PrefixConfig;
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -30,7 +31,7 @@ public class UserPrefixExpireEvent extends UserPrefixEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void call(@NotNull Player player, @NotNull PrefixConfig currentPrefix) {
|
public static void call(@NotNull Player player, @NotNull PrefixConfig currentPrefix) {
|
||||||
Main.getInstance().callSync(new UserPrefixExpireEvent(player, currentPrefix));
|
Main.getInstance().getFoliaScheduler().runGlobal(true, () -> Bukkit.getPluginManager().callEvent(new UserPrefixExpireEvent(player, currentPrefix)));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,121 @@
|
|||||||
|
package cc.carm.plugin.userprefix.folia;
|
||||||
|
|
||||||
|
import cc.carm.plugin.userprefix.Main;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.plugin.Plugin;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class FoliaScheduler {
|
||||||
|
private final Main plugin;
|
||||||
|
private final boolean folia;
|
||||||
|
|
||||||
|
public FoliaScheduler(Main plugin, boolean folia) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.folia = folia;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void runAsync(Runnable task) {
|
||||||
|
if (this.folia) {
|
||||||
|
this.runAsyncFolia(task);
|
||||||
|
} else {
|
||||||
|
this.runAsyncBukkit(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runAsyncBukkit(Runnable task) {
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(this.plugin, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runAsyncFolia(Runnable task) {
|
||||||
|
// AsyncScheduler asyncScheduler = Bukkit.getAsyncScheduler();
|
||||||
|
// asyncScheduler.runNow(this.plugin, t -> task.run());
|
||||||
|
|
||||||
|
try {
|
||||||
|
Object asyncScheduler = Bukkit.class.getMethod("getAsyncScheduler")
|
||||||
|
.invoke(null);
|
||||||
|
asyncScheduler.getClass().getMethod("runNow", Plugin.class, Consumer.class)
|
||||||
|
.invoke(asyncScheduler, this.plugin, (Consumer<?>) t -> task.run());
|
||||||
|
} catch (IllegalAccessException | NoSuchMethodException e) {
|
||||||
|
Main.severe("unexpected exception during reflection (#runAsyncFolia), it should never happen!");
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
throw (RuntimeException) e.getTargetException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Folia 上在实体所在的调度器上执行任务,或在 Bukkit 上同步执行任务
|
||||||
|
*
|
||||||
|
* @param entity 实体
|
||||||
|
* @param forceSync 若为 true,Bukkit 下强制同步运行;若为 false,Bukkit 下直接执行
|
||||||
|
* @param task 任务
|
||||||
|
* @see FoliaScheduler#runBukkit(boolean, Runnable)
|
||||||
|
* @see FoliaScheduler#runOnEntityFolia(Entity, Runnable)
|
||||||
|
*/
|
||||||
|
public void runOnEntity(Entity entity, boolean forceSync, Runnable task) {
|
||||||
|
if (this.folia) {
|
||||||
|
this.runOnEntityFolia(entity, task);
|
||||||
|
} else {
|
||||||
|
this.runBukkit(forceSync, task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runOnEntityFolia(Entity entity, Runnable task) {
|
||||||
|
// EntityScheduler entityScheduler = entity.getScheduler();
|
||||||
|
// entityScheduler.run(this.plugin, t -> task.run(), null);
|
||||||
|
try {
|
||||||
|
Object entityScheduler = Entity.class.getMethod("getScheduler")
|
||||||
|
.invoke(entity);
|
||||||
|
entityScheduler.getClass().getMethod("run", Plugin.class, Consumer.class, Runnable.class)
|
||||||
|
.invoke(entityScheduler, this.plugin, (Consumer<?>) t -> task.run(), null);
|
||||||
|
} catch (IllegalAccessException | NoSuchMethodException e) {
|
||||||
|
Main.severe("unexpected exception during reflection (#runOnEntityFolia), it should never happen!");
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
throw (RuntimeException) e.getTargetException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Folia 上在全局调度器上执行任务,或在 Bukkit 上同步执行任务
|
||||||
|
*
|
||||||
|
* @param forceSync 若为 true,Bukkit 下强制同步运行;若为 false,Bukkit 下直接执行
|
||||||
|
* @param task 任务
|
||||||
|
* @see FoliaScheduler#runBukkit(boolean, Runnable)
|
||||||
|
* @see FoliaScheduler#runGlobalFolia(Runnable)
|
||||||
|
*/
|
||||||
|
public void runGlobal(boolean forceSync, Runnable task) {
|
||||||
|
if (this.folia) {
|
||||||
|
this.runGlobalFolia(task);
|
||||||
|
} else {
|
||||||
|
this.runBukkit(forceSync, task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runGlobalFolia(Runnable task) {
|
||||||
|
// GlobalRegionScheduler globalRegionScheduler = Bukkit.getGlobalRegionScheduler();
|
||||||
|
// globalRegionScheduler.execute(this.plugin, task);
|
||||||
|
try {
|
||||||
|
Object globalRegionScheduler = Bukkit.class.getMethod("getGlobalRegionScheduler")
|
||||||
|
.invoke(null);
|
||||||
|
globalRegionScheduler.getClass().getMethod("execute", Plugin.class, Runnable.class)
|
||||||
|
.invoke(globalRegionScheduler, this.plugin, task);
|
||||||
|
} catch (IllegalAccessException | NoSuchMethodException e) {
|
||||||
|
Main.severe("unexpected exception during reflection (#runGlobalFolia), it should never happen!");
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
throw (RuntimeException) e.getTargetException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runBukkit(boolean forceSync, Runnable task) {
|
||||||
|
if (forceSync) {
|
||||||
|
Bukkit.getScheduler().runTask(this.plugin, task);
|
||||||
|
} else {
|
||||||
|
task.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package cc.carm.plugin.userprefix.folia;
|
||||||
|
|
||||||
|
import cc.carm.plugin.userprefix.Main;
|
||||||
|
import org.bukkit.enchantments.Enchantment;
|
||||||
|
|
||||||
|
public interface MajorUtil {
|
||||||
|
static Enchantment getEnchantProtection() {
|
||||||
|
Class<Enchantment> enchantmentClass = Enchantment.class;
|
||||||
|
try {
|
||||||
|
return (Enchantment) enchantmentClass.getField("PROTECTION_ENVIRONMENTAL").get(null);
|
||||||
|
} catch (NoSuchFieldException e1) {
|
||||||
|
try {
|
||||||
|
return (Enchantment) enchantmentClass.getField("PROTECTION").get(null);
|
||||||
|
} catch (NoSuchFieldException | IllegalAccessException e2) {
|
||||||
|
Main.severe("unexpected exception during reflection (#getEnchantProtection), it should never happen!");
|
||||||
|
throw new RuntimeException(e2);
|
||||||
|
}
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
Main.severe("unexpected exception during reflection (#getEnchantProtection), it should never happen!");
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,89 +1,82 @@
|
|||||||
package cc.carm.plugin.userprefix.hooker;
|
package cc.carm.plugin.userprefix.hooker;
|
||||||
|
|
||||||
import cc.carm.plugin.userprefix.Main;
|
import cc.carm.lib.easyplugin.papi.EasyPlaceholder;
|
||||||
|
import cc.carm.lib.easyplugin.papi.expansion.SubExpansion;
|
||||||
|
import cc.carm.lib.easyplugin.papi.handler.PlaceholderHandler;
|
||||||
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
||||||
import cc.carm.plugin.userprefix.configuration.prefix.PrefixConfig;
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.function.BiFunction;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class UserPrefixExpansion extends PlaceholderExpansion {
|
public class UserPrefixExpansion extends EasyPlaceholder {
|
||||||
|
|
||||||
protected final @NotNull Main plugin;
|
public UserPrefixExpansion(@NotNull JavaPlugin plugin, @NotNull String rootIdentifier) {
|
||||||
protected final @NotNull List<String> placeholders = Arrays.asList(
|
super(plugin, rootIdentifier);
|
||||||
"%UserPrefix_prefix%", "%UserPrefix_weight%",
|
|
||||||
"%UserPrefix_identifier%", "%UserPrefix_name%",
|
handle("version", (player, args) -> getVersion());
|
||||||
"%UserPrefix_has_<Identifier>%"
|
|
||||||
);
|
handle("identifier", handlePrefix(PrefixConfig::getIdentifier), "id");
|
||||||
|
handle("prefix", handlePrefix(PrefixConfig::getContent));
|
||||||
|
handle("name", handlePrefix(PrefixConfig::getName));
|
||||||
|
handle("description", handlePrefix(p -> String.join("\n", p.getDescription())));
|
||||||
|
handle("weight", handlePrefix(PrefixConfig::getWeight));
|
||||||
|
handle("amount", handlePlayer(
|
||||||
|
(player) -> UserPrefixAPI.getUserManager().getUsablePrefixes(player).size() + 1)
|
||||||
|
);
|
||||||
|
|
||||||
|
handle("has", handlePlayer((player, args) -> {
|
||||||
|
if (args.length < 1) return "参数不足";
|
||||||
|
PrefixConfig prefix = UserPrefixAPI.getPrefixManager().getPrefix(args[0]);
|
||||||
|
if (prefix == null) return "该前缀不存在";
|
||||||
|
return prefix.checkPermission(player);
|
||||||
|
}), Collections.singletonList("<前缀ID>"));
|
||||||
|
|
||||||
public UserPrefixExpansion(@NotNull Main plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public PlaceholderHandler handlePrefix(Function<PrefixConfig, Object> handler) {
|
||||||
public @NotNull List<String> getPlaceholders() {
|
return handlePlayer((player, args) -> handler.apply(UserPrefixAPI.getUserManager().getPrefix(player)));
|
||||||
return this.placeholders;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PlaceholderHandler handlePrefix(BiFunction<PrefixConfig, Player, Object> handler) {
|
||||||
|
return handlePlayer((player, args) -> handler.apply(UserPrefixAPI.getUserManager().getPrefix(player), player));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is required or else PlaceholderAPI will unregister the Expansion on reload
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean canRegister() {
|
public boolean persist() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public PlaceholderHandler handlePlayer(BiFunction<Player, String[], Object> handler) {
|
||||||
public @NotNull String getAuthor() {
|
return (player, args) -> {
|
||||||
return plugin.getDescription().getAuthors().toString();
|
if (player == null || !player.isOnline()) return "Loading...";
|
||||||
|
return handler.apply((Player) player, args);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlaceholderHandler handlePlayer(Function<Player, Object> handler) {
|
||||||
|
return handlePlayer((player, args) -> handler.apply(player));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull String getIdentifier() {
|
public String onErrorParams(@Nullable OfflinePlayer player) {
|
||||||
return "UserPrefix";
|
return "参数不足";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull String getVersion() {
|
public String onException(@Nullable OfflinePlayer player, @NotNull SubExpansion<?> expansion,
|
||||||
return plugin.getDescription().getVersion();
|
@NotNull Exception exception) {
|
||||||
}
|
exception.printStackTrace();
|
||||||
|
return "参数错误";
|
||||||
@Override
|
|
||||||
public String onPlaceholderRequest(Player player, @NotNull String identifier) {
|
|
||||||
if (player == null) return "加载中...";
|
|
||||||
String[] args = identifier.split("_");
|
|
||||||
|
|
||||||
|
|
||||||
if (args.length < 1) {
|
|
||||||
return "参数不足";
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (args[0].toLowerCase()) {
|
|
||||||
case "identifier": {
|
|
||||||
return UserPrefixAPI.getUserManager().getPrefix(player).getIdentifier();
|
|
||||||
}
|
|
||||||
case "prefix": {
|
|
||||||
return UserPrefixAPI.getUserManager().getPrefix(player).getContent();
|
|
||||||
}
|
|
||||||
case "name": {
|
|
||||||
return UserPrefixAPI.getUserManager().getPrefix(player).getName();
|
|
||||||
}
|
|
||||||
case "weight": {
|
|
||||||
return Integer.toString(UserPrefixAPI.getUserManager().getPrefix(player).getWeight());
|
|
||||||
}
|
|
||||||
case "has": {
|
|
||||||
if (args.length < 2) return "参数不足";
|
|
||||||
PrefixConfig prefix = UserPrefixAPI.getPrefixManager().getPrefix(args[1]);
|
|
||||||
if (prefix == null) return "该前缀不存在";
|
|
||||||
return Boolean.toString(prefix.checkPermission(player));
|
|
||||||
}
|
|
||||||
case "version": {
|
|
||||||
return getVersion();
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
return "参数错误";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,7 @@ package cc.carm.plugin.userprefix.listener;
|
|||||||
|
|
||||||
import cc.carm.lib.easyplugin.utils.MessageUtils;
|
import cc.carm.lib.easyplugin.utils.MessageUtils;
|
||||||
import cc.carm.plugin.userprefix.Main;
|
import cc.carm.plugin.userprefix.Main;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginConfig;
|
import cc.carm.plugin.userprefix.conf.PluginConfig;
|
||||||
import me.clip.placeholderapi.PlaceholderAPI;
|
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
@@ -20,8 +19,8 @@ public class ChatListener implements Listener {
|
|||||||
try {
|
try {
|
||||||
event.setFormat(MessageUtils.setPlaceholders(event.getPlayer(), format));
|
event.setFormat(MessageUtils.setPlaceholders(event.getPlayer(), format));
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
Main.serve("请检查配置文件中聊天相关是否配置正确。");
|
Main.severe("请检查配置文件中聊天相关是否配置正确。");
|
||||||
Main.serve("Please check the chat configuration.");
|
Main.severe("Please check the chat configuration.");
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -1,4 +1,4 @@
|
|||||||
package cc.carm.plugin.userprefix.listener.processor;
|
package cc.carm.plugin.userprefix.listener;
|
||||||
|
|
||||||
import cc.carm.plugin.userprefix.Main;
|
import cc.carm.plugin.userprefix.Main;
|
||||||
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
||||||
@@ -7,14 +7,14 @@ import net.luckperms.api.event.user.UserDataRecalculateEvent;
|
|||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
public class UserNodeUpdateProcessor {
|
public class UserPermListener {
|
||||||
|
|
||||||
public static void process(UserDataRecalculateEvent event) {
|
public static void process(UserDataRecalculateEvent event) {
|
||||||
Player player = Bukkit.getPlayer(event.getUser().getUniqueId());
|
Player player = Bukkit.getPlayer(event.getUser().getUniqueId());
|
||||||
if (player == null) return;
|
if (player == null) return;
|
||||||
UserPrefixAPI.getUserManager().checkPrefix(player, true);
|
UserPrefixAPI.getUserManager().checkPrefix(player, true);
|
||||||
if (PrefixSelectGUI.openingUsers.contains(player)) {
|
if (PrefixSelectGUI.openingUsers.contains(player)) {
|
||||||
Main.getInstance().getScheduler().run(() -> {
|
Main.getInstance().getFoliaScheduler().runOnEntity(player, true, () -> {
|
||||||
// 玩家权限更新,同步关闭其GUI,以令其重新打开刷新自己的前缀。
|
// 玩家权限更新,同步关闭其GUI,以令其重新打开刷新自己的前缀。
|
||||||
player.closeInventory();
|
player.closeInventory();
|
||||||
PrefixSelectGUI.removeOpening(player);
|
PrefixSelectGUI.removeOpening(player);
|
||||||
@@ -1,23 +1,23 @@
|
|||||||
package cc.carm.plugin.userprefix.manager;
|
package cc.carm.plugin.userprefix.manager;
|
||||||
|
|
||||||
import cc.carm.lib.configuration.core.source.ConfigurationProvider;
|
import cc.carm.lib.configuration.source.ConfigurationHolder;
|
||||||
import cc.carm.lib.easyplugin.utils.JarResourceUtils;
|
import cc.carm.lib.easyplugin.utils.JarResourceUtils;
|
||||||
import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration;
|
import cc.carm.lib.mineconfiguration.bukkit.MineConfiguration;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginConfig;
|
import cc.carm.plugin.userprefix.conf.PluginConfig;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginMessages;
|
import cc.carm.plugin.userprefix.conf.PluginMessages;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class ConfigManager {
|
public class ConfigManager {
|
||||||
|
|
||||||
private final ConfigurationProvider<?> configProvider;
|
private final ConfigurationHolder<?> configProvider;
|
||||||
private final ConfigurationProvider<?> messageProvider;
|
private final ConfigurationHolder<?> messageProvider;
|
||||||
|
|
||||||
public ConfigManager(File dataFolder) {
|
public ConfigManager(File dataFolder) {
|
||||||
firstInitialize(dataFolder);
|
firstInitialize(dataFolder);
|
||||||
this.configProvider = MineConfiguration.from(new File(dataFolder, "config.yml"));
|
this.configProvider = MineConfiguration.from(new File(dataFolder, "config.yml"), null);
|
||||||
this.messageProvider = MineConfiguration.from(new File(dataFolder, "messages.yml"));
|
this.messageProvider = MineConfiguration.from(new File(dataFolder, "messages.yml"), null);
|
||||||
this.configProvider.initialize(PluginConfig.class);
|
this.configProvider.initialize(PluginConfig.class);
|
||||||
this.messageProvider.initialize(PluginMessages.class);
|
this.messageProvider.initialize(PluginMessages.class);
|
||||||
}
|
}
|
||||||
@@ -26,7 +26,7 @@ public class ConfigManager {
|
|||||||
File configFile = new File(dataFolder, "config.yml");
|
File configFile = new File(dataFolder, "config.yml");
|
||||||
if (!configFile.exists()) {
|
if (!configFile.exists()) {
|
||||||
try {
|
try {
|
||||||
JarResourceUtils.copyFolderFromJar("en_US", dataFolder, JarResourceUtils.CopyOption.COPY_IF_NOT_EXIST);
|
JarResourceUtils.copyFolderFromJar("i18n", dataFolder, JarResourceUtils.CopyOption.COPY_IF_NOT_EXIST);
|
||||||
JarResourceUtils.copyFolderFromJar("prefixes", dataFolder, JarResourceUtils.CopyOption.COPY_IF_NOT_EXIST);
|
JarResourceUtils.copyFolderFromJar("prefixes", dataFolder, JarResourceUtils.CopyOption.COPY_IF_NOT_EXIST);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -35,11 +35,11 @@ public class ConfigManager {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConfigurationProvider<?> getConfigProvider() {
|
public ConfigurationHolder<?> getConfigProvider() {
|
||||||
return configProvider;
|
return configProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ConfigurationProvider<?> getMessageProvider() {
|
public ConfigurationHolder<?> getMessageProvider() {
|
||||||
return messageProvider;
|
return messageProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,17 @@
|
|||||||
package cc.carm.plugin.userprefix.manager;
|
package cc.carm.plugin.userprefix.manager;
|
||||||
|
|
||||||
import cc.carm.lib.mineconfiguration.bukkit.data.ItemConfig;
|
import cc.carm.lib.easyplugin.gui.configuration.GUIActionConfiguration;
|
||||||
import cc.carm.lib.mineconfiguration.bukkit.source.CraftSectionWrapper;
|
import cc.carm.lib.easyplugin.utils.ItemStackFactory;
|
||||||
import cc.carm.plugin.userprefix.Main;
|
import cc.carm.plugin.userprefix.Main;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginConfig;
|
import cc.carm.plugin.userprefix.conf.PluginConfig;
|
||||||
import cc.carm.plugin.userprefix.configuration.prefix.PrefixConfig;
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
|
import com.cryptomorin.xseries.XItemStack;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.configuration.ConfigurationSection;
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
import org.bukkit.configuration.file.FileConfiguration;
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.Contract;
|
import org.jetbrains.annotations.Contract;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -41,9 +43,9 @@ public class PrefixManager {
|
|||||||
|
|
||||||
String[] filesList = prefixDataFolder.list();
|
String[] filesList = prefixDataFolder.list();
|
||||||
if (filesList == null || filesList.length < 1) {
|
if (filesList == null || filesList.length < 1) {
|
||||||
Main.serve("配置文件夹中暂无任何前缀配置问,请检查。");
|
Main.severe("配置文件夹中暂无任何前缀配置问,请检查。");
|
||||||
Main.serve("There's no configured prefix.");
|
Main.severe("There's no configured prefix.");
|
||||||
Main.serve("Path: " + prefixDataFolder.getAbsolutePath());
|
Main.severe("Path: " + prefixDataFolder.getAbsolutePath());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,12 +59,12 @@ public class PrefixManager {
|
|||||||
if (files.size() > 0) {
|
if (files.size() > 0) {
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
try {
|
try {
|
||||||
PrefixConfig prefix = adPrefix(file);
|
PrefixConfig prefix = addPrefix(file);
|
||||||
Main.debugging("完成前缀加载 " + prefix.getIdentifier() + " : " + prefix.getName());
|
Main.debugging("完成前缀加载 " + prefix.getIdentifier() + " : " + prefix.getName());
|
||||||
loaded.put(prefix.getIdentifier(), prefix);
|
loaded.put(prefix.getIdentifier(), prefix);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Main.serve("在加载前缀 " + file.getAbsolutePath() + " 时出错,请检查配置!");
|
Main.severe("在加载前缀 " + file.getAbsolutePath() + " 时出错,请检查配置!");
|
||||||
Main.serve("Error occurred when loading prefix #" + file.getAbsolutePath() + " !");
|
Main.severe("Error occurred when loading prefix #" + file.getAbsolutePath() + " !");
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,12 +77,14 @@ public class PrefixManager {
|
|||||||
this.defaultPrefix = new PrefixConfig(
|
this.defaultPrefix = new PrefixConfig(
|
||||||
"default",
|
"default",
|
||||||
PluginConfig.DEFAULT_PREFIX.NAME.getNotNull(),
|
PluginConfig.DEFAULT_PREFIX.NAME.getNotNull(),
|
||||||
PluginConfig.DEFAULT_PREFIX.CONTENT.getNotNull(),
|
PluginConfig.DEFAULT_PREFIX.DESCRIPTION.getNotNull(),
|
||||||
|
PluginConfig.DEFAULT_PREFIX.CONTENT.resolve(),
|
||||||
|
PluginConfig.DEFAULT_PREFIX.PERIOD.resolve(),
|
||||||
PluginConfig.DEFAULT_PREFIX.WEIGHT.getNotNull(),
|
PluginConfig.DEFAULT_PREFIX.WEIGHT.getNotNull(),
|
||||||
null,
|
null,
|
||||||
|
readActions(PluginConfig.DEFAULT_PREFIX.ACTIONS.get()),
|
||||||
PluginConfig.DEFAULT_PREFIX.ITEM.NOT_USING.getNotNull(),
|
PluginConfig.DEFAULT_PREFIX.ITEM.NOT_USING.getNotNull(),
|
||||||
PluginConfig.DEFAULT_PREFIX.ITEM.USING.get(),
|
PluginConfig.DEFAULT_PREFIX.ITEM.USING.get(), null
|
||||||
null
|
|
||||||
);
|
);
|
||||||
Main.debugging(" 完成默认前缀加载 " + defaultPrefix.getName());
|
Main.debugging(" 完成默认前缀加载 " + defaultPrefix.getName());
|
||||||
}
|
}
|
||||||
@@ -122,34 +126,55 @@ public class PrefixManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static @NotNull PrefixConfig adPrefix(@NotNull File file) throws Exception {
|
public static @NotNull PrefixConfig addPrefix(@NotNull File file) throws Exception {
|
||||||
FileConfiguration configuration = YamlConfiguration.loadConfiguration(file);
|
FileConfiguration conf = YamlConfiguration.loadConfiguration(file);
|
||||||
String identifier = configuration.getString("identifier");
|
String identifier = conf.getString("identifier");
|
||||||
if (identifier == null) throw new Exception("配置文件 " + file.getAbsolutePath() + " 中没有配置前缀的唯一标识。");
|
if (identifier == null)
|
||||||
|
throw new Exception("配置文件 " + file.getAbsolutePath() + " 中没有配置前缀的唯一标识。");
|
||||||
|
|
||||||
String name = configuration.getString("name");
|
String name = conf.getString("name");
|
||||||
if (name == null) throw new Exception("配置文件 " + file.getAbsolutePath() + " 中没有配置前缀的显示名称。");
|
if (name == null) throw new Exception("配置文件 " + file.getAbsolutePath() + " 中没有配置前缀的显示名称。");
|
||||||
|
|
||||||
|
|
||||||
|
List<String> content = new ArrayList<>();
|
||||||
|
if (conf.isList("content")) {
|
||||||
|
content = conf.getStringList("content");
|
||||||
|
} else {
|
||||||
|
String single = conf.getString("content");
|
||||||
|
if (single != null) content.add(single);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return new PrefixConfig(
|
return new PrefixConfig(
|
||||||
identifier, name,
|
identifier, name,
|
||||||
configuration.getString("content", "&r"),
|
conf.getStringList("description"),
|
||||||
configuration.getInt("weight", 1),
|
content,
|
||||||
configuration.getString("permission"),
|
conf.getLong("period", -1L),
|
||||||
|
conf.getInt("weight", 1),
|
||||||
|
conf.getString("permission"),
|
||||||
|
readActions(conf.getStringList("actions")),
|
||||||
readItem(
|
readItem(
|
||||||
configuration.getConfigurationSection("item.has-perm"),
|
conf.getConfigurationSection("item.has-perm"),
|
||||||
new ItemConfig(Material.STONE, name, Arrays.asList(" ", "§a➥ 点击切换到该前缀"))
|
new ItemStackFactory(Material.STONE)
|
||||||
|
.setDisplayName(name)
|
||||||
|
.addLore("§a➥ 点击切换到该前缀")
|
||||||
|
.toItemStack()
|
||||||
),
|
),
|
||||||
readItem(configuration.getConfigurationSection("item.using"), null),
|
readItem(conf.getConfigurationSection("item.using"), null),
|
||||||
readItem(configuration.getConfigurationSection("item.no-perm"), null)
|
readItem(conf.getConfigurationSection("item.no-perm"), null)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Contract("_,!null->!null")
|
@Contract("_,!null->!null")
|
||||||
protected static ItemConfig readItem(@Nullable ConfigurationSection section, @Nullable ItemConfig defaultValue) throws Exception {
|
protected static ItemStack readItem(@Nullable ConfigurationSection section,
|
||||||
|
@Nullable ItemStack defaultValue) throws Exception {
|
||||||
if (section == null) return defaultValue;
|
if (section == null) return defaultValue;
|
||||||
else return ItemConfig.deserialize(CraftSectionWrapper.of(section));
|
else return XItemStack.deserialize(section);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static List<GUIActionConfiguration> readActions(@NotNull List<String> strings) {
|
||||||
|
return strings.stream().map(GUIActionConfiguration::deserialize).filter(Objects::nonNull).collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ package cc.carm.plugin.userprefix.manager;
|
|||||||
import cc.carm.lib.easyplugin.gui.GUI;
|
import cc.carm.lib.easyplugin.gui.GUI;
|
||||||
import cc.carm.plugin.userprefix.Main;
|
import cc.carm.plugin.userprefix.Main;
|
||||||
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginConfig;
|
import cc.carm.plugin.userprefix.conf.PluginConfig;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginMessages;
|
import cc.carm.plugin.userprefix.conf.PluginMessages;
|
||||||
import cc.carm.plugin.userprefix.configuration.prefix.PrefixConfig;
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
import cc.carm.plugin.userprefix.event.UserPrefixChangeEvent;
|
import cc.carm.plugin.userprefix.event.UserPrefixChangeEvent;
|
||||||
import cc.carm.plugin.userprefix.event.UserPrefixExpireEvent;
|
import cc.carm.plugin.userprefix.event.UserPrefixExpireEvent;
|
||||||
import cc.carm.plugin.userprefix.hooker.UserNameTag;
|
import cc.carm.plugin.userprefix.hooker.UserNameTag;
|
||||||
@@ -32,7 +32,7 @@ public class UserManager {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public UserNameTag getNameTag(Player player) {
|
public UserNameTag getNameTag(Player player) {
|
||||||
if (PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull()) {
|
if (this.isNamePrefixEnabled()) {
|
||||||
if (nameTags.containsKey(player.getUniqueId())) {
|
if (nameTags.containsKey(player.getUniqueId())) {
|
||||||
return nameTags.get(player.getUniqueId());
|
return nameTags.get(player.getUniqueId());
|
||||||
} else {
|
} else {
|
||||||
@@ -53,7 +53,7 @@ public class UserManager {
|
|||||||
|
|
||||||
public void initPlayer(Player player) {
|
public void initPlayer(Player player) {
|
||||||
checkPrefix(player, false);
|
checkPrefix(player, false);
|
||||||
if (PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull()) {
|
if (this.isNamePrefixEnabled()) {
|
||||||
createNameTag(player);
|
createNameTag(player);
|
||||||
updatePrefixView(player, true);
|
updatePrefixView(player, true);
|
||||||
}
|
}
|
||||||
@@ -73,14 +73,14 @@ public class UserManager {
|
|||||||
* @param loadOthers 是否为玩家更新其他人的前缀(一般用于加入游戏)
|
* @param loadOthers 是否为玩家更新其他人的前缀(一般用于加入游戏)
|
||||||
*/
|
*/
|
||||||
public void updatePrefixView(Player player, boolean loadOthers) {
|
public void updatePrefixView(Player player, boolean loadOthers) {
|
||||||
if (!PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull()) return; //未启用的情况下,不需要进行任何操作。
|
if (!this.isNamePrefixEnabled()) return; //未启用的情况下,不需要进行任何操作。
|
||||||
UserNameTag tag = getNameTag(player);
|
UserNameTag tag = getNameTag(player);
|
||||||
if (tag == null) return; //未启用的情况下,不需要进行任何操作。
|
if (tag == null) return; //未启用的情况下,不需要进行任何操作。
|
||||||
|
|
||||||
PrefixConfig playerPrefix = getPrefix(player);
|
PrefixConfig playerPrefix = getPrefix(player);
|
||||||
boolean descOrder = PluginConfig.FUNCTIONS.NAME_PREFIX.ORDER_DESC.getNotNull();
|
boolean descOrder = PluginConfig.FUNCTIONS.NAME_PREFIX.ORDER_DESC.getNotNull();
|
||||||
|
|
||||||
tag.setPrefix(playerPrefix.getContent());
|
tag.setPrefix(playerPrefix.getContent(player));
|
||||||
tag.setOrder(descOrder ? 999 - playerPrefix.getWeight() : playerPrefix.getWeight());
|
tag.setOrder(descOrder ? 999 - playerPrefix.getWeight() : playerPrefix.getWeight());
|
||||||
|
|
||||||
Main.debugging("为玩家 " + player.getName() + " 设置了 " + player.getName() + "的前缀为 #" + playerPrefix.getWeight() + " " + playerPrefix.getName());
|
Main.debugging("为玩家 " + player.getName() + " 设置了 " + player.getName() + "的前缀为 #" + playerPrefix.getWeight() + " " + playerPrefix.getName());
|
||||||
@@ -90,7 +90,7 @@ public class UserManager {
|
|||||||
UserNameTag onlinePlayerTag = getNameTag(onlinePlayer);
|
UserNameTag onlinePlayerTag = getNameTag(onlinePlayer);
|
||||||
|
|
||||||
if (onlinePlayerTag != null) {
|
if (onlinePlayerTag != null) {
|
||||||
onlinePlayerTag.setPrefix(player, playerPrefix.getContent());
|
onlinePlayerTag.setPrefix(player, playerPrefix.getContent(onlinePlayer));
|
||||||
onlinePlayerTag.setOrder(player, descOrder ? 999 - playerPrefix.getWeight() : playerPrefix.getWeight());
|
onlinePlayerTag.setOrder(player, descOrder ? 999 - playerPrefix.getWeight() : playerPrefix.getWeight());
|
||||||
Main.debugging("为玩家 " + onlinePlayer.getName() + " 设置了 " + player.getName() + "的前缀为 #" + playerPrefix.getWeight() + " " + playerPrefix.getName());
|
Main.debugging("为玩家 " + onlinePlayer.getName() + " 设置了 " + player.getName() + "的前缀为 #" + playerPrefix.getWeight() + " " + playerPrefix.getName());
|
||||||
|
|
||||||
@@ -98,7 +98,7 @@ public class UserManager {
|
|||||||
|
|
||||||
if (loadOthers) {
|
if (loadOthers) {
|
||||||
PrefixConfig onlinePlayerPrefix = getPrefix(onlinePlayer);
|
PrefixConfig onlinePlayerPrefix = getPrefix(onlinePlayer);
|
||||||
tag.setPrefix(onlinePlayer, onlinePlayerPrefix.getContent());
|
tag.setPrefix(onlinePlayer, onlinePlayerPrefix.getContent(player));
|
||||||
tag.setOrder(onlinePlayer, descOrder ? 999 - onlinePlayerPrefix.getWeight() : onlinePlayerPrefix.getWeight());
|
tag.setOrder(onlinePlayer, descOrder ? 999 - onlinePlayerPrefix.getWeight() : onlinePlayerPrefix.getWeight());
|
||||||
Main.debugging("为玩家 " + player.getName() + " 设置了 " + onlinePlayer.getName() + "的前缀为 #" + onlinePlayerPrefix.getWeight() + " " + onlinePlayerPrefix.getName());
|
Main.debugging("为玩家 " + player.getName() + " 设置了 " + onlinePlayer.getName() + "的前缀为 #" + onlinePlayerPrefix.getWeight() + " " + onlinePlayerPrefix.getName());
|
||||||
}
|
}
|
||||||
@@ -131,19 +131,17 @@ public class UserManager {
|
|||||||
UserPrefixExpireEvent.call(player, currentPrefix);
|
UserPrefixExpireEvent.call(player, currentPrefix);
|
||||||
|
|
||||||
// 发送消息
|
// 发送消息
|
||||||
PluginMessages.EXPIRED.send(player, newPrefix.getName(), currentPrefix.getName());
|
PluginMessages.EXPIRED.sendTo(player, currentPrefix.getName(), newPrefix.getName());
|
||||||
|
|
||||||
// 播放声音
|
// 播放声音
|
||||||
PluginConfig.SOUNDS.PREFIX_EXPIRED.playTo(player);
|
PluginConfig.SOUNDS.PREFIX_EXPIRED.playTo(player);
|
||||||
} else {
|
} else {
|
||||||
// 当前前缀为空,则代表是旧的前缀不存在了,
|
// 当前前缀为空,则代表是旧的前缀不存在了,
|
||||||
PluginMessages.REMOVED.send(player, newPrefix.getName(), currentPrefixData);
|
PluginMessages.REMOVED.sendTo(player, newPrefix.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
UserPrefixChangeEvent.call(player, currentPrefix, newPrefix, (after) -> {
|
UserPrefixChangeEvent.call(player, currentPrefix, newPrefix, (after) -> {
|
||||||
if (after != null) {
|
if (after != null) setPrefix(player, after, updateView);
|
||||||
setPrefix(player, after, updateView);
|
|
||||||
}
|
|
||||||
checkingPlayers.remove(player.getUniqueId());
|
checkingPlayers.remove(player.getUniqueId());
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -183,6 +181,7 @@ public class UserManager {
|
|||||||
*/
|
*/
|
||||||
public void setPrefix(Player player, PrefixConfig prefix, boolean updateView) {
|
public void setPrefix(Player player, PrefixConfig prefix, boolean updateView) {
|
||||||
setPrefixData(player, prefix.getIdentifier());
|
setPrefixData(player, prefix.getIdentifier());
|
||||||
|
prefix.executeActions(player);
|
||||||
if (updateView) updatePrefixView(player, false);
|
if (updateView) updatePrefixView(player, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,7 +209,7 @@ public class UserManager {
|
|||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public PrefixConfig getHighestPrefix(Player player) {
|
public PrefixConfig getHighestPrefix(Player player) {
|
||||||
if (PluginConfig.FUNCTIONS.AUTO_USE.getNotNull()) {
|
if (!PluginConfig.FUNCTIONS.AUTO_USE.getNotNull()) {
|
||||||
// 关闭了自动选择,就直接给默认的前缀,让玩家自己去设置吧~
|
// 关闭了自动选择,就直接给默认的前缀,让玩家自己去设置吧~
|
||||||
return UserPrefixAPI.getDefaultPrefix();
|
return UserPrefixAPI.getDefaultPrefix();
|
||||||
}
|
}
|
||||||
@@ -274,4 +273,7 @@ public class UserManager {
|
|||||||
user.data().clear(NodeType.META.predicate(mn -> mn.getMetaKey().equals(META_KEY)));
|
user.data().clear(NodeType.META.predicate(mn -> mn.getMetaKey().equals(META_KEY)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isNamePrefixEnabled() {
|
||||||
|
return PluginConfig.FUNCTIONS.NAME_PREFIX.ENABLE.getNotNull() && !Main.getInstance().isOnFolia();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,21 +4,23 @@ import cc.carm.lib.easyplugin.gui.GUIItem;
|
|||||||
import cc.carm.lib.easyplugin.gui.GUIType;
|
import cc.carm.lib.easyplugin.gui.GUIType;
|
||||||
import cc.carm.lib.easyplugin.gui.paged.AutoPagedGUI;
|
import cc.carm.lib.easyplugin.gui.paged.AutoPagedGUI;
|
||||||
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
import cc.carm.plugin.userprefix.UserPrefixAPI;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginConfig;
|
import cc.carm.plugin.userprefix.conf.PluginConfig;
|
||||||
import cc.carm.plugin.userprefix.configuration.PluginMessages;
|
import cc.carm.plugin.userprefix.conf.PluginMessages;
|
||||||
import cc.carm.plugin.userprefix.configuration.prefix.PrefixConfig;
|
import cc.carm.plugin.userprefix.conf.prefix.PrefixConfig;
|
||||||
|
import cc.carm.plugin.userprefix.event.UserPrefixChangeEvent;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.inventory.ClickType;
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public class PrefixSelectGUI extends AutoPagedGUI {
|
public class PrefixSelectGUI extends AutoPagedGUI {
|
||||||
|
|
||||||
public static HashSet<Player> openingUsers = new HashSet<>();
|
public static HashSet<Player> openingUsers = new HashSet<>();
|
||||||
|
|
||||||
Player player;
|
protected final Player player;
|
||||||
|
|
||||||
public PrefixSelectGUI(Player player) {
|
public PrefixSelectGUI(Player player) {
|
||||||
super(GUIType.SIX_BY_NINE, PluginConfig.GUI.TITLE.get(), 10, 43);
|
super(GUIType.SIX_BY_NINE, PluginConfig.GUI.TITLE.get(), 10, 43);
|
||||||
@@ -27,7 +29,7 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
|||||||
setPreviousPageSlot(18);
|
setPreviousPageSlot(18);
|
||||||
setNextPageSlot(26);
|
setNextPageSlot(26);
|
||||||
|
|
||||||
loadBackButton();
|
loadExtraIcons();
|
||||||
loadItems();
|
loadItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,8 +37,8 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
|||||||
return player;
|
return player;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadBackButton() {
|
public void loadExtraIcons() {
|
||||||
PluginConfig.GUI.ITEMS.BACK.getOptional().ifPresent(item -> item.setupItems(player, this));
|
PluginConfig.GUI.ITEMS.getNotNull().getItems().values().forEach(v -> v.setupItems(player, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadItems() {
|
public void loadItems() {
|
||||||
@@ -48,18 +50,28 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
|||||||
|
|
||||||
for (PrefixConfig prefix : prefixList) {
|
for (PrefixConfig prefix : prefixList) {
|
||||||
if (prefix.getIdentifier().equals(usingPrefix.getIdentifier())) {
|
if (prefix.getIdentifier().equals(usingPrefix.getIdentifier())) {
|
||||||
addItem(new GUIItem(prefix.getItemWhenUsing(player) != null ? prefix.getItemWhenUsing(player) : prefix.getItemHasPermission(player)));
|
addItem(new GUIItem(Optional
|
||||||
|
.ofNullable(prefix.getItemWhenUsing(player))
|
||||||
|
.orElse(prefix.getItemHasPermission(player))
|
||||||
|
));
|
||||||
} else if (prefix.checkPermission(player)) {
|
} else if (prefix.checkPermission(player)) {
|
||||||
addItem(new GUIItem(prefix.getItemHasPermission(player)) {
|
addItem(new GUIItem(prefix.getItemHasPermission(player)) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClick(ClickType type) {
|
public void onClick(Player clicker, ClickType type) {
|
||||||
player.closeInventory();
|
player.closeInventory();
|
||||||
//再次检查,防止打开GUI后、选择前的时间段内权限消失
|
//再次检查,防止打开GUI后、选择前的时间段内权限消失
|
||||||
if (prefix.checkPermission(player)) {
|
if (prefix.checkPermission(player)) {
|
||||||
UserPrefixAPI.getUserManager().setPrefix(player, prefix, true);
|
|
||||||
|
|
||||||
|
// 发送消息与提示
|
||||||
PluginConfig.SOUNDS.PREFIX_CHANGE.playTo(player);
|
PluginConfig.SOUNDS.PREFIX_CHANGE.playTo(player);
|
||||||
PluginMessages.SELECTED.send(player, prefix.getName());
|
PluginMessages.SELECTED.sendTo(player, prefix.getName());
|
||||||
|
|
||||||
|
UserPrefixChangeEvent.call(player, usingPrefix, prefix, config -> {
|
||||||
|
if (config == null) return;
|
||||||
|
UserPrefixAPI.getUserManager().setPrefix(player, config, true);
|
||||||
|
});
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
PluginConfig.SOUNDS.GUI_CLICK.playTo(player);
|
PluginConfig.SOUNDS.GUI_CLICK.playTo(player);
|
||||||
}
|
}
|
||||||
@@ -68,7 +80,7 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
|||||||
} else {
|
} else {
|
||||||
addItem(new GUIItem(prefix.getItemNoPermission(player)) {
|
addItem(new GUIItem(prefix.getItemNoPermission(player)) {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(ClickType type) {
|
public void onClick(Player clicker, ClickType type) {
|
||||||
PluginConfig.SOUNDS.GUI_CLICK.playTo(player);
|
PluginConfig.SOUNDS.GUI_CLICK.playTo(player);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -95,7 +107,7 @@ public class PrefixSelectGUI extends AutoPagedGUI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void open(Player player) {
|
public static void open(Player player) {
|
||||||
player.closeInventory(); // 防止冲突
|
// player.closeInventory(); // 防止冲突
|
||||||
PluginConfig.SOUNDS.GUI_OPEN.playTo(player);
|
PluginConfig.SOUNDS.GUI_OPEN.playTo(player);
|
||||||
new PrefixSelectGUI(player).openGUI(player);
|
new PrefixSelectGUI(player).openGUI(player);
|
||||||
openingUsers.add(player);
|
openingUsers.add(player);
|
||||||
|
|||||||
+18
-3
@@ -8,8 +8,16 @@ name: "&b&lPro&b"
|
|||||||
|
|
||||||
# Content [Necessary]
|
# Content [Necessary]
|
||||||
# Use in Placeholders
|
# Use in Placeholders
|
||||||
|
# Supports multiple lines for content rotation.
|
||||||
content: "&b&lPro &b"
|
content: "&b&lPro &b"
|
||||||
|
|
||||||
|
# Period [Unnecessary]
|
||||||
|
# Set the rotation period of the prefix content, in milliseconds.
|
||||||
|
# If set to -1, it will not rotate.
|
||||||
|
# If set to 0, it will randomly select a line each time the prefix is fetched
|
||||||
|
# If set to a value greater than 0, it will rotate the content every specified milliseconds.
|
||||||
|
period: -1
|
||||||
|
|
||||||
# Weight [Necessary]
|
# Weight [Necessary]
|
||||||
# used for sorting in the GUI and TabList
|
# used for sorting in the GUI and TabList
|
||||||
# In GUI : the larger is displayed at the back
|
# In GUI : the larger is displayed at the back
|
||||||
@@ -22,11 +30,18 @@ weight: 1
|
|||||||
# (because it is impossible to display items without permission at all)
|
# (because it is impossible to display items without permission at all)
|
||||||
permission: "yc.vip"
|
permission: "yc.vip"
|
||||||
|
|
||||||
|
# Actions when select [Unnecessary]
|
||||||
|
# Please check https://github.com/CarmJos/UserPrefix/tree/master/.documentation/ACTIONS.md
|
||||||
|
actions:
|
||||||
|
- "[CONSOLE] say %player_name% selected PRO !"
|
||||||
|
|
||||||
|
# Display item configuration
|
||||||
|
# More details please see https://github.com/CryptoMorin/XSeries/wiki/XItemStack
|
||||||
item:
|
item:
|
||||||
# itemHasPermission [Necessary]
|
# itemHasPermission [Necessary]
|
||||||
# This Item will be displayed when player has permission
|
# This Item will be displayed when player has permission
|
||||||
has-perm:
|
has-perm:
|
||||||
type: DIAMOND
|
material: DIAMOND
|
||||||
name: "&b&lVIP Prefix"
|
name: "&b&lVIP Prefix"
|
||||||
lore:
|
lore:
|
||||||
- ""
|
- ""
|
||||||
@@ -36,7 +51,7 @@ item:
|
|||||||
# This Item will be displayed when the prefix is selected.
|
# This Item will be displayed when the prefix is selected.
|
||||||
# If there is no such configuration, it will automatically display "itemHasPermission".
|
# If there is no such configuration, it will automatically display "itemHasPermission".
|
||||||
using:
|
using:
|
||||||
type: DIAMOND
|
material: DIAMOND
|
||||||
name: "&b&lVIP Prefix"
|
name: "&b&lVIP Prefix"
|
||||||
enchants:
|
enchants:
|
||||||
PROTECTION_ENVIRONMENTAL: 1 #Add an enchantment so it looks like it’s selected
|
PROTECTION_ENVIRONMENTAL: 1 #Add an enchantment so it looks like it’s selected
|
||||||
@@ -48,7 +63,7 @@ item:
|
|||||||
# If player doesn't have the permission,this item will be displayed.
|
# If player doesn't have the permission,this item will be displayed.
|
||||||
# If this item is not configured, it will not be displayed in the GUI when the player does not have permission to use it.
|
# If this item is not configured, it will not be displayed in the GUI when the player does not have permission to use it.
|
||||||
no-perm:
|
no-perm:
|
||||||
type: INK_SACK
|
material: INK_SACK
|
||||||
data: 8
|
data: 8
|
||||||
name: "&b&lVIP &c(Buy it!)"
|
name: "&b&lVIP &c(Buy it!)"
|
||||||
lore:
|
lore:
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
|
||||||
|
# Nombre [Necesario]
|
||||||
|
# Uso en mensajes.
|
||||||
|
name: "&b&lPro&b"
|
||||||
|
|
||||||
|
# Contenido [Necesario]
|
||||||
|
# Uso en Placeholders
|
||||||
|
# Soporta múltiples líneas para la rotación de contenido.
|
||||||
|
content: "&b&lPro &b"
|
||||||
|
|
||||||
|
# Periodo [Innecesario]
|
||||||
|
# Establece el periodo de rotación del contenido del prefijo, en milisegundos.
|
||||||
|
# Si se establece en -1, no rotará.
|
||||||
|
# Si se establece en 0, seleccionará aleatoriamente una línea cada vez que se
|
||||||
|
# obtenga el prefijo.
|
||||||
|
# Si se establece en un valor mayor que 0, rotará el contenido cada los mil
|
||||||
|
# segundos especificados.
|
||||||
|
period: -1
|
||||||
|
|
||||||
|
# Weight [Necesario]
|
||||||
|
# utilizado para ordenar en la GUI y TabList
|
||||||
|
# En GUI : el más grande se muestra en la parte posterior
|
||||||
|
# En TabList : el más grande se muestra en la parte superior
|
||||||
|
weight: 1
|
||||||
|
|
||||||
|
# Permisos [Innecesario]
|
||||||
|
# Si no hay permiso para la detección, todo el mundo puede utilizarlo,
|
||||||
|
# lo que significa que no es necesario configurar "itemNoPermission"
|
||||||
|
# (porque es imposible mostrar elementos sin permiso en absoluto)
|
||||||
|
permission: "yc.vip"
|
||||||
|
|
||||||
|
# Acciones al seleccionar [Innecesario]
|
||||||
|
# Por favor, compruebe https://github.com/CarmJos/UserPrefix/tree/master/.documentation/ACTIONS.md
|
||||||
|
actions:
|
||||||
|
- "[CONSOLE] say %player_name% Has seleccionado La etiqueta PRO!"
|
||||||
|
|
||||||
|
item:
|
||||||
|
# itemHasPermission [Necesario]
|
||||||
|
# Este elemento se mostrará cuando el jugador tenga permiso
|
||||||
|
has-perm:
|
||||||
|
material: DIAMOND
|
||||||
|
name: "&b&lVIP Prefix"
|
||||||
|
lore:
|
||||||
|
- ""
|
||||||
|
- "&a➥ Pulsa para utilizar"
|
||||||
|
|
||||||
|
# itemUsing [Innecesario]
|
||||||
|
# Este elemento se mostrará cuando se seleccione el prefijo.
|
||||||
|
# Si no existe tal configuración, se mostrará automáticamente "itemHasPermission".
|
||||||
|
using:
|
||||||
|
material: DIAMOND
|
||||||
|
name: "&b&lPrefix VIP"
|
||||||
|
enchants:
|
||||||
|
PROTECTION_ENVIRONMENTAL: 1 #Añade un encantamiento para que parezca que está seleccionado
|
||||||
|
lore:
|
||||||
|
- ""
|
||||||
|
- "&a✔ Seleccionado"
|
||||||
|
|
||||||
|
# itemNoPermission [Innecesario]
|
||||||
|
# Si el jugador no tiene el permiso,este item sera mostrado.
|
||||||
|
# Si este elemento no está configurado, no se mostrará en la GUI cuando el jugador no tenga permiso para usarlo.
|
||||||
|
no-perm:
|
||||||
|
material: INK_SACK
|
||||||
|
data: 8
|
||||||
|
name: "&b&lVIP &c(¡Cómpralo!)"
|
||||||
|
lore:
|
||||||
|
- ""
|
||||||
|
- "&e✯ Necesitas Comprar el VIP para utilizarlo!"
|
||||||
@@ -8,6 +8,7 @@ authors:
|
|||||||
website: ${project.url}
|
website: ${project.url}
|
||||||
description: ${project.description}
|
description: ${project.description}
|
||||||
api-version: 1.13
|
api-version: 1.13
|
||||||
|
folia-supported: true
|
||||||
|
|
||||||
depend:
|
depend:
|
||||||
- LuckPerms
|
- LuckPerms
|
||||||
|
|||||||
@@ -5,12 +5,20 @@ identifier: "pro"
|
|||||||
|
|
||||||
# 名字 [必须]
|
# 名字 [必须]
|
||||||
# 切换的时候左下角会弹提示 用的就是这个名字
|
# 切换的时候左下角会弹提示 用的就是这个名字
|
||||||
name: "&b&lPro&b"
|
name: "&b&lPro &b会员"
|
||||||
|
|
||||||
# 内容 [必须]
|
# 内容 [必须]
|
||||||
# 显示在名字前面的内容
|
# 显示在名字前面的内容
|
||||||
|
# 支持多行内容以实现前缀内容的轮换
|
||||||
content: "&b&lPro &b"
|
content: "&b&lPro &b"
|
||||||
|
|
||||||
|
# 轮换周期 [非必须]
|
||||||
|
# 设置前缀内容的轮换周期,单位为毫秒。
|
||||||
|
# 若数值为-1,则表示不轮换。
|
||||||
|
# 若数值为0,则每次获取前缀时都会随机选择一行内容。
|
||||||
|
# 若数值大于0,则表示每隔指定毫秒数轮换一次内容
|
||||||
|
period: -1
|
||||||
|
|
||||||
# 权重 [必须]
|
# 权重 [必须]
|
||||||
# 用于GUI、TabList的排序和自动前缀显示
|
# 用于GUI、TabList的排序和自动前缀显示
|
||||||
# 在GUI中,权重越高的会显示在越后面
|
# 在GUI中,权重越高的会显示在越后面
|
||||||
@@ -22,50 +30,53 @@ weight: 1
|
|||||||
# 如果没有就是人人都能用,也代表不用配置“itemNoPermission”了(因为压根不可能显示没权限时候的物品)
|
# 如果没有就是人人都能用,也代表不用配置“itemNoPermission”了(因为压根不可能显示没权限时候的物品)
|
||||||
permission: "yc.pro"
|
permission: "yc.pro"
|
||||||
|
|
||||||
|
# 选择这个前缀时执行的操作 [非必须]
|
||||||
|
# 用于在玩家选择/取消选择前缀时执行相应动作,以便于实现一些特殊的功能。
|
||||||
|
# 具体操作类型详见介绍,前缀操作不支持限定点击类型。
|
||||||
|
# https://github.com/CarmJos/UserPrefix/tree/master/.documentation/ACTIONS.md
|
||||||
|
actions:
|
||||||
|
- "[CONSOLE] say %player_name% 选择了 Pro会员前缀 !"
|
||||||
|
|
||||||
|
description: # 描述 [非必须]
|
||||||
|
- "&f尊贵的Pro会员专属称号。"
|
||||||
|
- "&f您将获得多种特权与更好的游戏体验。"
|
||||||
|
- "&f您可以输入 &b/vip &f指令查看详细特权!"
|
||||||
|
|
||||||
# 该前缀的GUI物品配置
|
# 该前缀的GUI物品配置
|
||||||
|
# 物品配置方式详见 https://github.com/CryptoMorin/XSeries/wiki/XItemStack
|
||||||
item:
|
item:
|
||||||
|
|
||||||
# 有权限时显示的物品 [必须]
|
# 有权限时显示的物品 [必须]
|
||||||
# 当用户有权限且未选中时,会显示该物品
|
# 当用户有权限且未选中时,会显示该物品
|
||||||
has-perm:
|
has-perm:
|
||||||
type: DIAMOND
|
material: DIAMOND
|
||||||
name: "&b&lPro &b会员前缀"
|
name: "%(name)"
|
||||||
lore:
|
lore:
|
||||||
- "&7Pro会员专属称号"
|
- "&7Pro会员专属称号"
|
||||||
- ""
|
- "#desciption#{1,1}"
|
||||||
- "&f尊贵的Pro会员专属称号。"
|
|
||||||
- "&f您将获得多种特权与更好的游戏体验。"
|
|
||||||
- ""
|
|
||||||
- "&a➥ 点击切换到该前缀"
|
- "&a➥ 点击切换到该前缀"
|
||||||
|
|
||||||
# 正在使用时显示的物品 [非必需]
|
# 正在使用时显示的物品 [非必需]
|
||||||
# 当用户正在使用时会显示这个物品,不配置即自动加载“itemHasPermission”
|
# 当用户正在使用时会显示这个物品,不配置即自动加载“itemHasPermission”
|
||||||
using:
|
using:
|
||||||
type: DIAMOND
|
material: DIAMOND
|
||||||
name: "&b&lPro &b会员前缀"
|
name: "%(name)"
|
||||||
flags:
|
flags:
|
||||||
- HIDE_ENCHANTS # 隐藏附魔显示
|
- HIDE_ENCHANTS # 隐藏附魔显示
|
||||||
enchants:
|
enchants:
|
||||||
PROTECTION_ENVIRONMENTAL: 1 #加一个附魔这样看上去就像是选中了的
|
PROTECTION_ENVIRONMENTAL: 1 #加一个附魔这样看上去就像是选中了的
|
||||||
lore:
|
lore:
|
||||||
- "&7Pro会员专属称号"
|
- "&7Pro会员专属称号"
|
||||||
- ""
|
- "#desciption#{1,1}"
|
||||||
- "&f尊贵的Pro会员专属称号。"
|
|
||||||
- "&f您将获得多种特权与更好的游戏体验。"
|
|
||||||
- ""
|
|
||||||
- "&a✔ 您正在使用该前缀"
|
- "&a✔ 您正在使用该前缀"
|
||||||
|
|
||||||
# 没有权限时显示的物品 [非必需]
|
# 没有权限时显示的物品 [非必需]
|
||||||
# 如果没有权限就会显示这个item。如果不配置该物品,则玩家没有使用权限时不会显示在GUI里面。
|
# 如果没有权限就会显示这个item。如果不配置该物品,则玩家没有使用权限时不会显示在GUI里面。
|
||||||
no-perm:
|
no-perm:
|
||||||
type: INK_SACK
|
material: INK_SACK
|
||||||
data: 8
|
data: 8
|
||||||
name: "&b&lPro+ &b会员前缀 &c(未拥有)"
|
name: "%(name) &c(未拥有)"
|
||||||
lore:
|
lore:
|
||||||
- "&7Pro+会员专属称号"
|
- "&7Pro 会员专属称号"
|
||||||
- ""
|
- "#desciption#{1,1}"
|
||||||
- "&f尊贵的Pro会员专属称号。"
|
- "&e✯ 加入Pro会员以使用该前缀!"
|
||||||
- "&f您将获得多种特权与更好的游戏体验。"
|
|
||||||
- "&f您可以输入 &b/vip &f指令查看详细特权!"
|
|
||||||
- ""
|
|
||||||
- "&e✯ 加入Pro+会员以使用该前缀!"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user